MongoDB中含NaN字段计算$sum/$avg及PyMongo过滤NaN的方法
问题原因
你遇到的报错是因为Python全局作用域没有内置NaN变量,并非Python/PyMongo不支持匹配MongoDB中的NaN值。
解决方法
方案1:导入Python内置NaN(兼容性最好,支持所有MongoDB版本)
你只需要从Python标准库math模块导入nan即可,PyMongo会自动将其序列化为BSON格式的NaN,和JavaScript中直接写NaN的效果完全一致。
修正后的PyMongo代码如下:
import math from pymongo import MongoClient # 数据库连接逻辑此处省略 db = MongoClient().你的数据库名称 result = db['plan.data_pool'].aggregate([ {'$match': {'geoid': '00', 'v': {'$ne': math.nan}}}, {'$group': {'_id': '$accountable_id', 'agg': {'$sum': '$v'}}} ])
如果你项目中已经使用NumPy,也可以用numpy.nan代替math.nan,效果完全相同。
方案2:使用MongoDB内置$isNaN操作符(MongoDB 4.4及以上版本支持)
不需要导入任何Python变量,直接用MongoDB聚合表达式判断字段是否为NaN,写法如下:
result = db['plan.data_pool'].aggregate([ {'$match': {'geoid': '00', '$expr': {'$not': {'$isNaN': '$v'}}}}, {'$group': {'_id': '$accountable_id', 'agg': {'$sum': '$v'}}} ])
两种方案都可以实现和你JavaScript版本完全一致的筛选效果,过滤掉v字段为NaN的文档后再做聚合计算。
内容的提问来源于stack exchange,提问作者Ahad Rafat Talebi
相关产品推荐
相关产品推荐

