如何在MongoDB中找到包含NaN字段的所有文档?

hap*_*ore 8 nan mongodb

我想删除所有NaN的geospacial字段,以便我可以正确索引我的MongoDB.

我怎么找到所有这些文件呢?

db.collection.find( { field: {$not: { $type: 1 } } })
Run Code Online (Sandbox Code Playgroud)

由于NaN的类型为Number,因此无法工作.

hap*_*ore 19

db.collection.find( { field: NaN })
Run Code Online (Sandbox Code Playgroud)

实际上工作,虽然我找不到任何文件

  • 我不明白你的观点,请你解释一下. (2认同)

con*_*xyz 5

PyMongo解决方案:

# If you're alright with numpy as a dependency
import numpy as np
db.collection.find({ 'field': np.nan })
Run Code Online (Sandbox Code Playgroud)

要么

db.collection.find({ 'field': float('nan') })
Run Code Online (Sandbox Code Playgroud)

仅供参考:我遇到了这个问题,因为mongoexport(mongo 3.0.7)NaN写入了它创建的JSON文件。 这似乎在3.3.5中已解决

因此,再次使用PyMongo并在类似的船上,您可以替换NaN为Python的Nonemongoexport它将转换为JSON有效null

import numpy as np
for doc in list(db.collection.find({ 'field': np.nan }))
    update_one({'_id': ObjectId(doc['_id'])},
               {'$set': {'field': (lambda x: None if np.isnan(x) else x)(doc['field'])}})
Run Code Online (Sandbox Code Playgroud)