MongoDB如何向符合过滤条件的子数组正确添加元素
问题
尝试仅向包含EDUCATION键的subcategory数组元素添加X和Y时出现异常:只要文档内存在至少一个包含EDUCATION键的subcategory元素,X和Y就会被添加到该文档下所有subcategory数组中,无法实现定向更新。
错误原因
常规的数组更新写法只会在文档层级判断匹配条件:只要文档里存在符合条件的数组元素,就会对整个数组执行更新,不会定位到具体符合要求的单个数组元素,这是更新范围越界的核心原因。
正确实现方法
使用MongoDB 3.6及以上版本支持的arrayFilters数组过滤更新能力,可以精准指定需要更新的数组元素,参考语句如下:
db.collection.updateMany( // 文档级过滤,筛出subcategory中存在EDUCATION键的文档,减少无意义的更新扫描 { "subcategory.EDUCATION": { $exists: true } }, // 使用位置标识符$[elem]指定要更新的数组节点,通过$each批量追加两个元素 { $push: { "subcategory.$[elem]": { $each: ["X", "Y"] } } }, // 配置数组过滤规则,只有带EDUCATION键的subcategory元素才会被更新 { arrayFilters: [ { "elem.EDUCATION": { $exists: true } } ] } )
注意点
$[elem]是自定义的数组元素占位符,名字可以任意修改,只要和arrayFilters里的匹配规则前缀对应即可- 如果只需要追加单个元素,可以去掉
$each修饰,直接在$push后写要追加的值 - 如果使用的是3.6以下的MongoDB版本,没有原生支持数组级条件更新,只能先查询出符合条件的文档,在业务层遍历定位到对应数组元素修改后再存回数据库
内容的提问来源于stack exchange,提问作者Fahd Lihidheb
相关产品推荐
相关产品推荐

