You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 08:38:24