使用Spring AggregationUpdate更新MongoDB嵌套数组多元素报错如何解决?
问题原因
- MongoDB的
$定位符仅支持更新数组中第一个匹配条件的元素,无法批量更新多个符合条件的数组元素,且你的代码没有在更新前声明数组元素的匹配规则,MongoDB无法解析$对应的字段路径,直接抛出字段路径异常。 - Spring Data MongoDB中匹配文档的查询条件不能放到
AggregationUpdate的构造参数中,文档匹配规则需要通过matching()方法传入,你现有写法的参数传递逻辑完全错误。
正确实现方案
方案1:使用arrayFilters实现(推荐,语法更简洁)
直接使用MongoDB的数组过滤器功能批量更新符合条件的元素,代码示例:
// 文档匹配条件 Query query = Query.query(Criteria.where("id").is("p00")); // 数组元素匹配规则:匹配children数组中id在指定列表内的元素 Update update = new Update() .set("children.$[elem].value", true) .filterArray(Criteria.where("elem.id").in(List.of("c00", "c01"))); // 执行更新 mongoTemplate.updateMulti(query, update, Parent.class);
方案2:使用AggregationUpdate实现
如果需要用聚合更新的方式,可通过$map算子遍历数组做字段替换,代码示例:
AggregationUpdate update = AggregationUpdate.newUpdate() .set("children") .withValueOf(ArrayOperators.Map.map("children") .as("elem") .andApply(ConditionalOperators.when( ComparisonOperators.In.valueOf("$$elem.id").in(List.of("c00", "c01")) ).then( MergeObjects.mergeObjectsOf("$$elem") .mergeWith(Document.parse("{\"value\": true}")) ).otherwise("$$elem")) ); mongoTemplate.update(Parent.class) .matching(Criteria.where("id").is("p00")) .apply(update) .all();
内容的提问来源于stack exchange,提问作者Half_Duplex
相关产品推荐
相关产品推荐

