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

17

我希望删除所有地理空间字段中的NaN值,以便正确索引我的MongoDB。

但是,我如何找到具有此问题的所有文档?

db.collection.find( { field: {$not: { $type: 1 } } })

无法起作用,因为NaN是Number类型。

2个回答

32
db.collection.find( { field: NaN })

实际上是有效的,尽管我找不到任何关于它的文档。


我认为这是不可能的。db.collection.find({ field: 0/0 }) 实际上会匹配到一些可能被插入为 Nan 的内容,但否则它将无法序列化为有效的 BSON。我认为当无法重现时,这个问题和答案是无效的。 - Neil Lunn
2
我不太明白您的观点,能否再解释一下? - happygilmore
1
这个查询有没有 pymongo 版本? - Mayank Jaiswal
@MayankJaiswal,请查看下面我的答案。 - conner.xyz

10

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 中已经解决了这个问题
所以,如果你正在使用 PyMongo 并遇到类似的问题,你可以使用 Python 的 None 替换 NaNmongoexport 会将其转换为 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'])}})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接