如何在MongoDB集合中满足条件时为数组对象内元素添加指定字段
MongoDB嵌套数组元素批量更新方案
你需要使用MongoDB 3.6及以上版本支持的arrayFilters(数组筛选器)实现多层嵌套数组的条件更新,具体语句如下:
完整更新语句
// 请替换下方yourCollectionName为你的实际集合名称 db.yourCollectionName.updateMany( // 过滤条件:仅匹配包含目标分类的文档,减少无效扫描(可选) { "Group.Category": { $elemMatch: { $or: [ { Categoryid: 123, Categoryname: "science" }, { Categoryid: 233, Categoryname: "Maths" } ] } } }, // 执行字段新增操作 { $set: { // 为science分类添加字段 "Group.$[].Category.$[scienceItem].CategoryLabel": "Hex", "Group.$[].Category.$[scienceItem].CategoryCode": "Hex-D", // 为Maths分类添加字段 "Group.$[].Category.$[mathsItem].CategoryLabel": "Mex", "Group.$[].Category.$[mathsItem].CategoryCode": "Mex-D" } }, // 数组筛选规则,仅匹配符合条件的Category元素 { arrayFilters: [ { "scienceItem.Categoryid": 123, "scienceItem.Categoryname": "science" }, { "mathsItem.Categoryid": 233, "mathsItem.Categoryname": "Maths" } ] } )
语法说明
$[]是全量占位符,会匹配Group数组下的所有元素,即使Group有多个元素也能正常命中- arrayFilters中定义的筛选规则只会作用到符合条件的Category元素,不会改动其他分类(比如示例中的language分类无任何变化)
- 若仅需要更新单个符合条件的文档,将
updateMany替换为updateOne即可
验证建议
执行更新前可以先运行查询语句确认匹配的文档是否符合预期,避免误操作:
db.yourCollectionName.find({ "Group.Category": { $elemMatch: { $or: [ { Categoryid: 123, Categoryname: "science" }, { Categoryid: 233, Categoryname: "Maths" } ] } } })
内容的提问来源于stack exchange,提问作者Franklin
相关产品推荐
相关产品推荐

