Spring mongodb添加或更新文档列表

gcmastyq  于 2023-01-12  发布在  Spring
关注(0)|答案(3)|浏览(161)

我有一系列的记录

[
    {"id":"1", "name":"a", "user":"u1"},
    {"id":"2", "name":"b", "user":"u1"},
    {"id":"3", "name":"c", "user":"u1"}
]

现在,根据数据库中是否存在条目,它应该更新或插入文档。对于更新,还存在一个条件,即现有user字段的值应该与文档中为user提供的值相匹配。
当然,我可以在循环中运行该列表并使用

mongoOperations.save(...);

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

idfiyjo8

idfiyjo81#

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

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

它可以接受数组列表并保存数组列表对象。不需要使用循环。
您可以看到下面的示例,其中InventoryService类创建了3个库存对象,并将所有对象添加到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-

3mpgtkmj

3mpgtkmj2#

您可以使用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);
h5qlskok

h5qlskok3#

您可以只用途:

mongoTemplate.insertAll(entities);

相关问题