MongoDB如何更新嵌套数组中ID在指定列表内的多个对象
MongoDB嵌套数组多匹配项批量更新解决方案
结论
该需求完全可以实现,无需将children数组提取为扁平化结构。
原有写法问题分析
你使用的$占位符是MongoDB早期的数组定位符,仅会匹配查询条件中命中的第一个数组元素,因此只能更新c00的value值,无法批量更新所有符合条件的数组元素。
解决方案
使用MongoDB 3.6及以上版本支持的带过滤条件的数组定位符$[<identifier>],配合arrayFilters参数即可实现多匹配项同时更新。
原生Mongo Shell示例
db.collection.updateMany( // 父文档匹配条件 { "id": "p00" }, // 更新规则,$[elem]为自定义的数组元素占位符 { $set: { "children.$[elem].value": false } }, // 数组过滤规则:匹配所有id在指定列表内的children元素 { arrayFilters: [ { "elem.id": { $in: ["c00", "c01"] } } ] } )
Spring Data MongoDB 对应写法(匹配你提供的API风格)
Update update = new Update() .set("children.$[elem].value", false) .filterArray(Criteria.where("elem.id").in(List.of("c00", "c01"))); mongoTemplate.updateMulti( Query.query(Criteria.where("id").is("p00")), update, 你的实体类.class );
注意事项
- 该特性最低支持MongoDB 3.6版本,只要你的服务端版本不低于该要求即可正常使用
- 完全兼容你现有的文档结构,无需做结构调整
- 若你的children数组元素的唯一标识字段实际为
_id,将上述代码中elem.id替换为elem._id即可
内容的提问来源于stack exchange,提问作者Half_Duplex
相关产品推荐
相关产品推荐

