MongoDB集合满足条件时为嵌套数组对象新增两个字段的实现方法
你可以使用MongoDB的arrayFilters特性实现嵌套数组元素的条件更新,以下是适用于MongoDB 3.6及以上版本的操作语句,执行后会直接修改集合中原有的数据:
// 请将下方的「yourCollection」替换为你实际的集合名称 db.yourCollection.updateMany( // 前置过滤:仅筛选出包含符合要求的Category元素的文档,可提升更新性能,无需要也可直接写{} { "Group.Category": { $elemMatch: { Categoryid: 123, Categoryname: "science" } } }, // 更新规则:给匹配到的Category对象新增两个指定字段 { $set: { "Group.$[group].Category.$[cate].CategoryLabel": "Hex", "Group.$[group].Category.$[cate].CategoryCode": "Hex-D" } }, // 数组过滤规则:分别指定两层嵌套数组的匹配条件 { arrayFilters: [ // 第一层Group数组匹配规则,此处无额外限制所以写空对象,有过滤需求可自行补充 {}, // 第二层Category数组匹配规则,仅匹配符合你要求的元素 { "cate.Categoryid": 123, "cate.Categoryname": "science" } ] } )
如果你不需要修改原集合数据,仅在查询时返回新增字段后的结果,可以使用如下聚合查询语句:
// 请将下方的「yourCollection」替换为你实际的集合名称 db.yourCollection.aggregate([ { $addFields: { Group: { $map: { input: "$Group", as: "group", in: { $mergeObjects: [ "$$group", { Category: { $map: { input: "$$group.Category", as: "cate", in: { $cond: [ { $and: [ {$eq: ["$$cate.Categoryid", 123]}, {$eq: ["$$cate.Categoryname", "science"]} ] }, {$mergeObjects: ["$$cate", {CategoryLabel: "Hex", CategoryCode: "Hex-D"}]}, "$$cate" ] } } } } ] } } } } } ])
内容的提问来源于stack exchange,提问作者Franklin
相关产品推荐
相关产品推荐

