我希望删除所有地理空间字段中的NaN值,以便正确索引我的MongoDB。
但是,我如何找到具有此问题的所有文档?
db.collection.find( { field: {$not: { $type: 1 } } })
无法起作用,因为NaN是Number类型。
db.collection.find( { field: NaN })
实际上是有效的,尽管我找不到任何关于它的文档。
PyMongo的解决方案:
# If you're alright with numpy as a dependency
import numpy as np
db.collection.find({ 'field': np.nan })
或者db.collection.find({ 'field': float('nan') })
FYI: 我遇到了这个问题,因为 mongoexport
(mongo 3.0.7) 把 NaN
写入了它创建的 JSON 文件中。据说在 3.3.5 中已经解决了这个问题。None
替换 NaN
,mongoexport
会将其转换为 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'])}})
db.collection.find({ field: 0/0 })
实际上会匹配到一些可能被插入为Nan
的内容,但否则它将无法序列化为有效的 BSON。我认为当无法重现时,这个问题和答案是无效的。 - Neil Lunn