MongoDB聚合查询$group阶段如何将kid字段别名改为knowledge_id
报错原因
MongoDB的$group聚合阶段有固定语法规则:仅_id字段可直接指定为分组依据的表达式,其余所有自定义字段都必须通过累加器(如$sum、$first等)计算生成,你直接修改分组键字段名不符合语法要求,因此触发报错。
解决方案
以下是两种常用实现方案,效果完全一致:
方案1:分组后通过$project重命名(更直观易维护)
db.getCollection('register').aggregate( [ { $match: {"$or":[{"$and":[{"src":{"$in":["CR","FR"]}},{"status":{"$in":["Draft","InReview","Returned"]}},{kid:3940035}]}]} }, { $group: {'_id':"$kid",'count':{'$sum':1}} }, { $project: { _id: 0, knowledge_id: "$_id", count: 1 } } ] )
该方案保留原来的分组逻辑,仅在最后输出阶段重命名字段、隐藏不需要的_id字段即可。
方案2:分组阶段直接生成目标字段
db.getCollection('register').aggregate( [ { $match: {"$or":[{"$and":[{"src":{"$in":["CR","FR"]}},{"status":{"$in":["Draft","InReview","Returned"]}},{kid:3940035}]}]} }, { $group: { '_id':"$kid", 'knowledge_id': {$first: "$kid"}, 'count':{'$sum':1} } }, { $project: {_id: 0} } ] )
该方案利用同一分组内kid值完全相同的特性,用$first累加器提取kid值赋值给knowledge_id,最后移除默认返回的_id字段即可。
内容的提问来源于stack exchange,提问作者user3383301
相关产品推荐
相关产品推荐

