【问题标题】:How to make an upsert in an array of objects with Spring Boot MongoTemplate?如何使用 Spring Boot MongoTemplate 在对象数组中进行更新插入?
【发布时间】:2023-01-06 23:58:14
【问题描述】:

我在我的 Spring Boot 应用程序中工作,它是一个带有 MongoDB 数据库的 REST 服务。

想象一下这份文件:

_id: ObjectId('628b4d3ff5b1c1736c0b654c')
name: "MyComputer"
OS: "windows"
config: [
    {
        configId: ObjectId('628b4d3ff5b1c1736c0b654a'),
        type: "Type A"
    }
]

我想检查配置中是否有任何类型的对象“A型”.如果有,我想更新配置ID让我们说ObjectId('628b4d3ff5b1c1736c0b654d'),如果没有,我想创建一个类型为的新对象:“A型”configId: ObjectId('628b4d3ff5b1c1736c0b654d').

我如何在 MongoTemplate 中执行此操作?我试过这样的:

ObjectId ConfigId = new ObjectId("628b4d3ff5b1c1736c0b654a");

Query query = Query.query(Criteria.where("_id").is(new ObjectId('628b4d3ff5b1c1736c0b654c')));

Update update = new Update().filterArray(Criteria.where("config.id").is(ConfigId))
                .set("config", new Config(ConfigId, "Type A"));

mongoTemplate.upsert(query, update, Computer.class);

好像不行...

【问题讨论】:

    标签: java mongodb spring-boot upsert mongotemplate


    【解决方案1】:

    看起来您正在尝试更新配置数组中对象的 configId 字段,该对象的 configId 字段的值为 ObjectId('628b4d3ff5b1c1736c0b654a'),或者如果这样的对象不存在,则在具有指定configId 和类型的配置数组。

    要使用 MongoTemplate 实现此目的,您可以使用位置运算符来标识要更新的配置数组中的特定元素。位置运算符是出现在更新表达式中的$符号,用于标识应应用更新的数组元素。

    下面是一个示例,说明如何使用位置运算符更新配置数组中具有 configId 字段且值为 ObjectId('628b4d3ff5b1c1736c0b654a') 的对象的 configId 字段,或者如果这样的对象不存在则插入新对象:

    ObjectId configId = new ObjectId("628b4d3ff5b1c1736c0b654a");
    ObjectId newConfigId = new ObjectId("628b4d3ff5b1c1736c0b654d");
    
    Query query = Query.query(Criteria.where("_id").is(new ObjectId("628b4d3ff5b1c1736c0b654c"))
            .and("config.configId").is(configId));
    
    Update update = new Update().set("config.$.configId", newConfigId);
    
    mongoTemplate.upsert(query, update, Computer.class);
    

    此代码创建一个查询,将文档与指定的 _id 和配置数组中的对象与指定的 configId 相匹配。此更新将匹配数组元素的 configId 字段设置为 newConfigId 的值。

    如果配置数组中没有匹配的对象,更新将插入一个具有指定configId 和类型字段的新对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2021-07-21
      相关资源
      最近更新 更多