You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+PyMongo执行MongoDB统计查询时$project报错求助

解决PyMongo聚合统计中的FieldPath错误

错误原因

  1. 字段命名违规:MongoDB的$project阶段不允许字段名以$开头,你直接将$avg作为子字段名,触发了FieldPath field names may not start with '$'错误。
  2. 代码结构错误:Roll字段内错误嵌套了Heading字段,导致JSON结构混乱,进一步引发解析问题。
  3. 冗余数组操作:$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:42:02