Flask+PyMongo执行MongoDB统计查询时$project报错求助
解决PyMongo聚合统计中的FieldPath错误
错误原因
- 字段命名违规:MongoDB的
$project阶段不允许字段名以$开头,你直接将$avg作为子字段名,触发了FieldPath field names may not start with '$'错误。 - 代码结构错误:
Roll字段内错误嵌套了Heading字段,导致JSON结构混乱,进一步引发解析问题。 - 冗余数组操作:
$group阶段用$push已经收集到了目标字段的数组值,无需再用$reduce+$concatArrays做多余的数组拼接,直接对数组使用统计运算符即可。
修正后的聚合代码
docs = db.datatest.aggregate([ { "$group": { "_id": None, # 用None替代"null"更符合MongoDB规范 "Time": {"$push": "$Time"}, "Yaw": {"$push": "$Yaw"}, "Pitch": {"$push": "$Pitch"}, "Roll": {"$push": "$Roll"}, "Heading": {"$push": "$Heading"}, "Ax": {"$push": "$Ax"}, "Ay": {"$push": "$Ay"}, "Az": {"$push": "$Az"}, "Gx": {"$push": "$Gx"}, "Gy": {"$push": "$Gy"}, "Gz": {"$push": "$Gz"}, "Mx": {"$push": "$Mx"}, "My": {"$push": "$My"}, "Mz": {"$push": "$Mz"} } }, { "$project": { "_id": 0, "Time": { "Avg": {"$avg": "$Time"}, "StdDev": {"$stdDevPop": "$Time"}, "Min": {"$min": "$Time"}, "Max": {"$max": "$Time"}, "Count": {"$size": "$Time"} }, "Yaw": { "Avg": {"$avg": "$Yaw"}, "StdDev": {"$stdDevPop": "$Yaw"}, "Min": {"$min": "$Yaw"}, "Max": {"$max": "$Yaw"}, "Count": {"$size": "$Yaw"} }, "Pitch": { "Avg": {"$avg": "$Pitch"}, "StdDev": {"$stdDevPop": "$Pitch"}, "Min": {"$min": "$Pitch"}, "Max": {"$max": "$Pitch"}, "Count": {"$size": "$Pitch"} }, "Roll": { "Avg": {"$avg": "$Roll"}, "StdDev": {"$stdDevPop": "$Roll"}, "Min": {"$min": "$Roll"}, "Max": {"$max": "$Roll"}, "Count": {"$size": "$Roll"} }, "Heading": { "Avg": {"$avg": "$Heading"}, "StdDev": {"$stdDevPop": "$Heading"}, "Min": {"$min": "$Heading"}, "Max": {"$max": "$Heading"}, "Count": {"$size": "$Heading"} }, "Ax": { "Avg": {"$avg": "$Ax"}, "StdDev": {"$stdDevPop": "$Ax"}, "Min": {"$min": "$Ax"}, "Max": {"$max": "$Ax"}, "Count": {"$size": "$Ax"} }, "Ay": { "Avg": {"$avg": "$Ay"}, "StdDev": {"$stdDevPop": "$Ay"}, "Min": {"$min": "$Ay"}, "Max": {"$max": "$Ay"}, "Count": {"$size": "$Ay"} }, "Az": { "Avg": {"$avg": "$Az"}, "StdDev": {"$stdDevPop": "$Az"}, "Min": {"$min": "$Az"}, "Max": {"$max": "$Az"}, "Count": {"$size": "$Az"} }, "Gx": { "Avg": {"$avg": "$Gx"}, "StdDev": {"$stdDevPop": "$Gx"}, "Min": {"$min": "$Gx"}, "Max": {"$max": "$Gx"}, "Count": {"$size": "$Gx"} }, "Gy": { "Avg": {"$avg": "$Gy"}, "StdDev": {"$stdDevPop": "$Gy"}, "Min": {"$min": "$Gy"}, "Max": {"$max": "$Gy"}, "Count": {"$size": "$Gy"} }, "Gz": { "Avg": {"$avg": "$Gz"}, "StdDev": {"$stdDevPop": "$Gz"}, "Min": {"$min": "$Gz"}, "Max": {"$max": "$Gz"}, "Count": {"$size": "$Gz"} }, "Mx": { "Avg": {"$avg": "$Mx"}, "StdDev": {"$stdDevPop": "$Mx"}, "Min": {"$min": "$Mx"}, "Max": {"$max": "$Mx"}, "Count": {"$size": "$Mx"} }, "My": { "Avg": {"$avg": "$My"}, "StdDev": {"$stdDevPop": "$My"}, "Min": {"$min": "$My"}, "Max": {"$max": "$My"}, "Count": {"$size": "$My"} }, "Mz": { "Avg": {"$avg": "$Mz"}, "StdDev": {"$stdDevPop": "$Mz"}, "Min": {"$min": "$Mz"}, "Max": {"$max": "$Mz"}, "Count": {"$size": "$Mz"} } } } ]) for document in docs: return str(document)
关键说明
- 修正字段命名:将统计指标的键名从
$avg改为Avg这类普通名称,避免违反MongoDB的FieldPath规则。 - 修复结构错误:将原来嵌套在
Roll内的Heading字段独立出来,确保每个字段的统计对象结构正确。 - 简化聚合逻辑:去掉冗余的
$reduce+$concatArrays操作,直接对$group阶段收集到的数组使用$avg、$stdDevPop等统计运算符,提升效率。 - 规范
_id设置:用None替代字符串"null"作为分组ID,更符合MongoDB的语法规范。
内容的提问来源于stack exchange,提问作者youngt17
相关产品推荐
相关产品推荐

