【问题标题】:Spring mongodb add or update a list of documentsspring mongodb 添加或更新文档列表
【发布时间】:2017-09-04 03:02:53
【问题描述】:

我有一个像

这样的记录列表
[
    {"id":"1", "name":"a", "user":"u1"},
    {"id":"2", "name":"b", "user":"u1"},
    {"id":"3", "name":"c", "user":"u1"}
]

现在根据数据库中是否已经存在条目,它应该更新或插入文档。此外,对于更新还有一个条件,即现有 user 字段的值应与文档中为 user 提供的值匹配。

当然我可以循环运行列表并使用

mongoOperations.save(...);

但是如果我有一个巨大的列表,那么我将不得不为每个条目执行一个数据库操作,我认为这不是有效的。有没有其他有效的方法来执行这个操作?

【问题讨论】:

    标签: spring mongodb spring-data-mongodb spring-mongo spring-mongodb


    【解决方案1】:

    您可以使用 mongoTemplate.updateMulti() 来更新记录列表,如下所示

    Query query = new Query(); 
    query.addCriteria(Criteria.where("filteringField").is("filteringFieldValue));
    Update update = new Update();
    update.set("fieldToBeUpdated", "fieldToBeUpdatedValue");
    mongoTemplate.updateMulti(query, update, YourClass.class);
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 CRUD 存储库,那么 CRUD 存储库提供可用于单个实体(mongoCollection)的 save() 方法,或者您可以使用重载的 save 方法

      <S extends T> List<S> saveAll(Iterable<S> entites)
      

      它可以获取 Arraylist 并保存 Arraylist 对象。无需使用循环。

      您可以看到下面的示例,其中 InventoryService 类创建了 3 个 Inventory 对象并在 ArrayList 中添加所有对象,最后将其传递给作为 CRUD 存储库的清单存储库。

      @Service
      public class InventoryService {
      
          private static final Logger LOGGER = LoggerFactory.getLogger(InventoryService.class);
      
          @Autowired
          private InventoryRepository inventoryRepository;
      
          public void aveInventoryDetails() {
      
              List<Inventory> inventoryList = new ArrayList<Inventory>();
      
              inventoryList.add(new Inventory("500", 10));
              inventoryList.add(new Inventory("600", 20));
              inventoryList.add(new Inventory("700", 30));
      
              try {
                  inventoryRepository.saveAll(inventoryList);
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      示例 Mongo 存储库

      package com.bjs.repository;
      
      import org.springframework.cache.annotation.Cacheable;
      import org.springframework.data.mongodb.repository.MongoRepository;
      
      import com.bjs.model.Inventory;
      
      public interface InventoryRepository extends MongoRepository<Inventory, String> {
      
      // empty as not defining any new method , we can use the existing save method   
      
      }
      

      供参考 - http://docs.spring.io/autorepo/docs/spring-data-commons/1.9.1.RELEASE/api/org/springframework/data/repository/CrudRepository.html#save-java.lang.Iterable-

      【讨论】:

      • 或者自己实现循环——CrudRepository的实现使用循环。
      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 2016-01-22
      • 2013-11-30
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      相关资源
      最近更新 更多