如何使用Spring Data MongoDB将字符串字段重命名并转为数组?
MongoDB聚合管道updateMany转Spring Data MongoTemplate实现方案
原MongoDB Shell命令
db.example.updateMany({"outer.oldField": {$in: ["B", "C"]}}, [ {$set: {"outer.newField": ["$outer.oldField"]}}, {$unset: "outer.oldField"} ]);
尝试的无效Spring Data Mongo代码
mongoOperations.updateMulti( Query.query(Criteria.where("outer.oldField").in("B", "C")), AggregationUpdate.update() .set("outer.newField").toValueOf(ArrayOperators.arrayOf("[$outer.oldField]")) .unset("outer.oldField"), "example" )
示例数据
db.createCollection("example"); db.example.insertOne({outer: {oldField: "A"}}); db.example.insertOne({outer: {oldField: "A"}}); db.example.insertOne({outer: {oldField: "B"}}); db.example.insertOne({outer: {oldField: "C"}});
预期更新结果
> db.example.find() [ { _id: ObjectId("64839132bd73e957955e3029"), outer: { oldField: 'A' } }, { _id: ObjectId("64839132bd73e957955e302a"), outer: { oldField: 'A' } }, { _id: ObjectId("64839132bd73e957955e302b"), outer: { newField: [ 'B' ] } }, { _id: ObjectId("64839133bd73e957955e302c"), outer: { newField: [ 'C' ] } } ]
正确实现方案
原代码的问题在于错误将字符串字面量当作数组内容,而非引用目标字段的值。以下两种方法可实现需求:
方法1:直接添加管道阶段(与原MongoDB命令完全对齐)
AggregationUpdate update = AggregationUpdate.newUpdate() .addPipelineStage(new Document("$set", new Document("outer.newField", Arrays.asList("$outer.oldField")))) .addPipelineStage(new Document("$unset", "outer.oldField")); mongoOperations.updateMulti( Query.query(Criteria.where("outer.oldField").in("B", "C")), update, "example" );
方法2:使用Spring Data表达式API
AggregationUpdate update = AggregationUpdate.update() .set("outer.newField") .toValue(AggregationExpression.of(context -> Collections.singletonList(context.get("outer.oldField")))) .unset("outer.oldField"); mongoOperations.updateMulti( Query.query(Criteria.where("outer.oldField").in("B", "C")), update, "example" );
两种方法均可完成将符合条件的outer.oldField重命名为outer.newField并转换为单元素数组的操作,执行结果与预期一致。
内容的提问来源于stack exchange,提问作者M. Justin
相关产品推荐
相关产品推荐

