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

MongoDB $group字段返回null但同路径$addToSet有值问题咨询

问题原因
  • MongoDB $group 阶段有明确语法规则:只有固定的_id字段(分组依据字段)可以直接赋值字段路径,其余所有自定义输出字段都必须搭配聚合累加运算符使用,否则无法正确解析表达式,会返回null等异常值。
  • 你代码中的objectId是自定义输出字段,直接写$OrderObject.pharmacy.companyName没有搭配任何累加运算符,所以返回null;而同路径的pharmacyName使用了$addToSet累加器,符合语法规范,因此可以正常取值。
修复方案

如果你希望按OrderObject.pharmacy.companyName分组,且拿到的分组键值和pharmacyName内容一致,修改$group阶段的代码即可,示例如下:

{
    $group: {
        // 分组依据必须赋值给固定的_id字段
        _id: '$OrderObject.pharmacy.companyName',
        count: {
            $sum: 1
        },
        duration: {
            $avg: {
                $abs: {
                    $divide: [
                        {
                            $subtract: [
                                { $arrayElemAt: ['$date', 0] },
                                { $arrayElemAt: ['$date', 1] }
                            ]
                        },
                        60000
                    ]
                }
            }
        },
        OrderIDs: {
            $addToSet: '$OrderObject.orderID'
        },
        pharmacyName: {
            $addToSet: '$OrderObject.pharmacy.companyName'
        },
        // 如果必须保留objectId字段,搭配$first累加器取同分组的第一个值即可
        objectId: {
            $first: '$OrderObject.pharmacy.companyName'
        }
    }
}

修改后返回结果的_id字段值就和你预期的objectId内容完全一致,如果不需要额外保留objectId字段,直接取_id即可。

额外注意事项

当前代码如果遇到date数组长度小于2的文档,$arrayElemAt会返回null,导致差值计算出现异常,建议在聚合管道前置阶段加$match过滤date长度符合要求的文档,避免计算结果失真。

内容的提问来源于stack exchange,提问作者shash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:15:05