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
相关产品推荐
相关产品推荐

