当前位置: 首页 > 面试题库 >

Spring Data Mongo:更新了各个领域的upsert

井修雅
2023-03-14
问题内容

我正在寻找使用Spring Data提供的API对Mongo集合实施 upsert 操作的正确方法。

详细地,我有以下用例。集合的架构collection如下所示:

{
  _id: "some_id",
  field1: "value1",
  field2: "value2",
  subdocument1: {
    // A subdocument with some fields
  },
  subdocument2: {
    // A subdocument with some other fields
  }
}

字段field1field2总是存在的,但subdocument1subdocument2会在不同的时刻被插入:一个第一插入期间,第二与随后的更新。

我看到MongoTemplate有和upsert方法。使用这种方法,我必须构建自己的更新操作。

Query query = Query.query(Criteria.where("_id").is("some_id"));
Update.update("_id", "some_id")
      .set("field1", "value1")
      .set("field2", "value2")
      .set("subdocument1", subdocumentObject);
mongoTemplate.upsert(query, update, Collection.class);

我不知道这是我在寻找什么,还有没有更好的方法。


问题答案:

我相信你正在寻找的是$setOnInsertsubdocument1。所以类似的东西应该为您工作。

Query query = Query.query(Criteria.where("_id").is("some_id"));
Update update = Update.update("_id", "some_id")
                .set("field1", "value1")
                .set("field2", "value2")
                .set("subdocument2", subdocumentObject2)
                .setOnInsert("subdocument1", subdocumentObject1);

此处更多https://docs.mongodb.com/manual/reference/operator/update/setOnInsert/



 类似资料:
  • 这是我使用的代码 我试图添加一行“Lock Lock=new ReentrantLock();”但是asm抛出了一个错误 异常在线程"main"java.lang.IllegalArgumentException:值类java.util.concurrent.locks.在org.objectweb.asm.ClassWriter. a(未知来源)

  • 3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合

  • 3.4 ABP领域层 - 领域服务 3.4.1 简介 领域服务(或者服务,在DDD模式中)是被用来执行领域操作或者业务规则的。Eric Evans 在他的DDD书中这样说过:一个好的Service应该有以下三个特征: 与领域概念相关的操作不是Entity或Value Object 的一个自然部分; 接口是根据领域模型的其它元素定义的; 操作是无状态的。 领域服务和Application Servi

  • 钥匙斗篷中有2个领域:主人和自定义。两个都有admin用户。 自定义领域管理添加新用户new_admin并通过管理控制台为其分配角色admin。

  • DDD DSL DSL(domain-specific languages)即领域特定语言,唯一能够确定DSL边界的方法是考虑“一门语言的一种特定用法”和“该语言的设计者或使用者的意图。在试图设计一个DSL的时候,发现了一些有意思的简单的示例。 DSL示例 jQuery 最流行的DSL jQuery是一个Internal DSL的典型的例子。它是在一门现成语言内实现针对领域问题的描述。 $('.m