MongoDB 3.6中如何为数组子对象添加gLead字段?
正确聚合语句:为MongoDB数组元素添加字段
你的问题出在直接给groups.gLead赋值时,$map遍历的是整个groups数组,导致每个group的gLead被塞进了所有组的userId数组,形成嵌套结构。
要给每个groups元素单独添加gLead字段,需要用$map重新构建整个groups数组,在每个元素里新增目标字段:
db.collection.aggregate([ { "$addFields": { "groups": { "$map": { "input": "$groups", "as": "g", "in": { // 保留原group的所有字段 "$$g", // 新增gLead字段,提取当前group的userId数组 "gLead": "$$g.groupLeads.userId" } } } } } ])
逻辑说明
$map遍历原groups数组的每个元素(用$$g指代当前元素)- 每个新元素先保留原有所有字段(
"$$g"),再追加gLead字段,值为当前元素groupLeads中的userId集合(MongoDB会自动将数组对象的指定字段提取为一维数组) - 最终每个
groups元素的gLead都对应自身groupLeads的userId数组,不会出现嵌套
最终效果示例
执行后,第一个groups元素会变为:
{ "_id": ObjectId("648fc2857edfa7ee4f1ce31d"), "groupId": "1", "groupLeads": [ {"userId": "4"}, {"userId": "5"} ], "gLead": ["4", "5"] }
内容的提问来源于stack exchange,提问作者Adithya Visnu
相关产品推荐
相关产品推荐

