【问题标题】:How to use updateOption with arrayFilters in spring-data mongodb?如何在 spring-data mongodb 中使用 updateOption 和 arrayFilters?
【发布时间】:2018-07-07 17:33:40
【问题描述】:

我在Mongodb中有一个如下所示的文档:

现在,我想转到基于特定“_id”的文档,对于该文档,我想转到“计划”列表,其中有几个特定日期(不仅是一个日期,而是多个),我想将状态更新为“已预订”。我通过了这个链接, How to apply update using Filtered positional operator with arrayFilters 但是在 MongoTemplate 类中,updateMulti 方法不采用updateOption 参数。有人可以帮忙吗

我出去。真的将不胜感激任何建议。谢谢。

注意:我使用的是spring-data版本“2.0.3.RELEASE”,MongoDB驱动版本是v3.6.4。

以下是一份文件:

{
      "_id": "x1",
      "timeZone": "America/Los_Angeles",
      "schedule": [
        {
          "Date": "2018-07-10T00:00:00.000Z",
          "status": "AVAILABLE"
        },
        {
          "Date": "2018-07-10T00:30:00.000Z",
          "status": "AVAILABLE"
        },
        {
          "Date": "2018-07-10T08:00:00.000Z",
          "status": "AVAILABLE"
        }
      ],
      "_class": "com.scheduler.persistance.model.Calendar"
    }

【问题讨论】:

    标签: mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    它将很快在 spring-data-mongodb 中可用。见:https://github.com/spring-projects/spring-data-mongodb/pull/656

    使用它看起来像:

    new Update()
    .set("grades.$[element]", 100)
    .filterArray(Criteria.where("element").gte(100));
    

    与此同时,您应该能够将它与他们的快照 maven 存储库一起使用:

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>2.2.0.DATAMONGO-2215-SNAPSHOT</version>
    </dependency>
    
    <repository>
      <id>spring-libs-snapshot</id>
      <name>Spring Snapshot Repository</name>
      <url>https://repo.spring.io/libs-snapshot</url>
    </repository>
    

    【讨论】:

      【解决方案2】:

      如果 spring-data 中没有“updateOption”,那么我们可以使用普通的驱动 jar。希望能解决你的问题。

      MongoDatabase db = client.getDatabase("test");
      
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z');
      format.setTimeZone("EST");
      
      List<Date> dateList = Arrays.asList(new Date[]
                                      {format.parse("2018-07-10T00:30:00.000Z")}
                                     );
      
      db.getCollection("test").updateMany(new Document("_id", "x1"),
              new Documen("$set", new Document("schedule.$[elem].status", "booked")),
              new UpdateOptions().arrayFilters(Arrays.asList(new Document[]
                  {new Document("elem.Date", new Document("$in", dateList))}
              )));
      

      【讨论】:

      • 您好 Ravi,我正在研究 Spring Data 解决方案。我很欣赏你的回应。谢谢。
      【解决方案3】:

      // 假设您的集合是基于名称 Test.class 的类外

      Query query = new Query();
      query.addCriteria(Criteria.where("_id").is("someID");
      Update update = new Update();
      update.set("schedule.$[myRec].status", "BOOKED" );
      update.filterArray("myRec.Date", dateValue);
      FindAndModifyOptions options = new FindAndModifyOptions().returnNew(true);
      mongoTemplate.findAndModify(query, update, options, Test.class);
      

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        相关资源
        最近更新 更多