MongoDB聚合管道计算min/max价格返回None问题排查
问题原因
聚合管道的$project阶段存在字段遗漏:MongoDB聚合中使用$project时,除自动保留的_id字段外,所有未在阶段配置中显式声明的字段都会被过滤,不会流入后续管道阶段。
你的$project配置只生成了datetime字段,没有声明保留price字段,导致后续$group阶段执行$min、$max计算时,待处理的文档中根本不存在price字段,对不存在的字段做极值计算就会返回None。
修复方案
推荐直接把日期转换逻辑合并到$group阶段,省去单独的$project步骤,既不会漏字段,还能减少一次管道遍历提升性能,修正后的完整代码如下:
def min_max_volume(item_name): db = client.test mycol = db["ended"] pipeline = [ {"$match": {"item_name": item_name}}, {"$group": { '_id': { '$dateToString': { 'format': "%Y-%m-%d", 'date': { "$toDate": "$timestamp"}}}, 'min_price': {'$min': '$price'}, 'max_price': {'$max': '$price'}, }} ] results = mycol.aggregate(pipeline) for i in results: print(i)
如果你想保留原有$project阶段的写法,只需要在$project配置里显式加上price字段的保留声明即可:
{"$project": { 'datetime': { '$dateToString': { 'format': "%Y-%m-%d", 'date': { "$toDate": "$timestamp"}}}, 'price': 1 # 显式声明保留price字段,传递到后续阶段 }},
运行修正后的代码就能得到正常的极值计算结果,不会再出现min_price、max_price为None的问题。
内容的提问来源于stack exchange,提问作者Marlowe Oliver
相关产品推荐
相关产品推荐

