Java(Spring) MongoDB如何在update、push操作中引用文档其他字段值
问题根因
你使用的普通Update类对应MongoDB的基础更新操作,该模式下value()方法的传入参数会被作为字面量直接写入,不会解析为对文档自身字段的引用,因此你传入的"$field1"直接被作为字符串存入了数组。
解决方案
MongoDB 4.2及以上版本支持使用聚合管道作为更新逻辑,可以实现引用文档现有字段的更新操作,对应Spring Data MongoDB中需要使用AggregationUpdate实现,示例代码如下:
import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AggregationUpdate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import com.mongodb.client.result.UpdateResult; // 业务逻辑部分 Query select = Query.query(Criteria.where("id").in(docIdList)); V new_v = new V("NEW"); // 构造聚合更新管道,两个阶段按顺序执行 AggregationUpdate update = AggregationUpdate.newAggregationUpdate( // 第一阶段:将原field1值拼接到field2数组头部 Aggregation.set("field2", Aggregation.arrayOf("field1").concat("field2")), // 第二阶段:将field1更新为新值 Aggregation.set("field1", new_v) ); UpdateResult updateResult = mongoTemplate.updateMulti(select, update, V.class);
注意事项
- 需要MongoDB服务端版本 >= 4.2,才支持聚合管道更新特性
- 需要Spring Data MongoDB版本 >= 3.0,才提供
AggregationUpdate相关API - 聚合更新的阶段按顺序执行,第一阶段读取的是更新前的
field1值,符合你的业务逻辑要求
内容的提问来源于stack exchange,提问作者1LeveL1
相关产品推荐
相关产品推荐

