Java MongoDB一次保存多个文档

Java MongoDB一次保存多个文档,mongodb,spring-data-mongodb,mongo-java,mongo-java-driver,mongotemplate,Mongodb,Spring Data Mongodb,Mongo Java,Mongo Java Driver,Mongotemplate,我有一个更新对象/文档的列表,需要立即保存列表中的所有对象 我在MongoTemplate中看到了save(),但它可以一次保存一个文档。 有没有办法一次保存多个文档,或者我需要调用save in loop?这是一种方法 mongoTemplate.getCollection("your_collection_name").insert(List<Documents>) mongoTemplate.getCollection(“您的集合名称”)。插入(列表) 您可能还想签出类。有

我有一个更新对象/文档的列表,需要立即保存列表中的所有对象

我在MongoTemplate中看到了save(),但它可以一次保存一个文档。
有没有办法一次保存多个文档,或者我需要调用save in loop?

这是一种方法

mongoTemplate.getCollection("your_collection_name").insert(List<Documents>)
mongoTemplate.getCollection(“您的集合名称”)。插入(列表)
您可能还想签出类。

有关插入:

您应该使用如下函数:


谢谢你的帮助

我可以使用SpringDataMongoDB来实现这一点。 Spring数据MongoDB的MongoRepository有许多内置方法

org.springframework.data.mongodb.repository.MongoRepository.saveAll(Iterable entites)
是我用来保存多个文档的文档。

使用Spring,您可以轻松地一次存储多个文档

该接口已可用,方法saveAll和详细信息如下:

@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

    /*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#saveAll(java.lang.Iterable)
     */
    @Override
    <S extends T> List<S> saveAll(Iterable<S> entites);
//...
}
@NoRepositoryBean
公共接口MongoRepository扩展了分页和排序存储库,QueryByExampleExecutor{
/*
*(非Javadoc)
*@see org.springframework.data.repository.crudepository#saveAll(java.lang.Iterable)
*/
@凌驾
列出saveAll(可编辑的实体);
//...
}
Spring使用示例:

@Component
public class Processor {

@Autowired
public Processor(Repository repository) {
    this.repository= repository;
}

public void save(Iterable<ProductEntity> entites) {
    List<ProductEntity> saved = repository.saveAll(entites);
    logger.info("Saved {} entities", saved.size());
}

}
@组件
公共类处理器{
@自动连线
公共处理器(存储库){
this.repository=repository;
}
公共无效保存(Iterable entites){
List saved=repository.saveAll(实体);
info(“保存的{}实体”,Saved.size());
}
}
您的存储库界面:

//https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html
public interface Repository extends MongoRepository<ProductEntity, String> {   
}
//https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html
公共接口存储库扩展了MongoRepository{
}

使用产品实体的“列表”调用save方法

您可以使用
MongoTemplate的
insertAll
ReactiveMongoTemplate
,但必须谨慎使用。它执行其名称所代表的操作—插入所有文档。如果调用
save
方法,则
save
具有乐观锁定,因此它会检查您是否覆盖了不应该覆盖的文档(如果它具有
@Version
注释)
insertAll
不检查乐观锁定,因此只要您确实想执行插入,就可以使用它,例如,持久化尚未持久化的文档,或者您不关心覆盖这些文档和乐观锁定。如果您关心乐观锁定,那么您所能做的就是为每个文档调用
save
,这将生成大量的I/O操作,但这是确保您将使用匹配的版本更新文档所需要的。
您还必须记住,
insertAll
实际上插入了新文档,这意味着您不能使用此方法更新文档,因为您将获得重复的密钥异常。目前,spring mongo缺少一个允许更新所有文档的功能(您只能“插入”它们,所以第一次保存它们)

您尝试过
insertAll()
@pvpkiran insertAll()吗适用于新文档,但如果文档存在,我需要更新;如果文档不存在,我需要插入。此解决方案适用于新文档,但我需要更新现有文档。请参阅。然后您需要的是upsert:
UpdateOptions=newupdateOptions().upsert(true);yourCollectionOfDocuments.forEach(doc->{documentfilter=Filters.eq(“\u id”,doc.get(“id”))yourDb.getCollection(“your\u collection”).updateOne(filter,update,option)}
请注意,
MongoRepository.saveAll()
的默认实现是
simplemonogrepository.saveAll()
,它为每个更新发出单独的请求。
@Component
public class Processor {

@Autowired
public Processor(Repository repository) {
    this.repository= repository;
}

public void save(Iterable<ProductEntity> entites) {
    List<ProductEntity> saved = repository.saveAll(entites);
    logger.info("Saved {} entities", saved.size());
}

}
//https://docs.spring.io/spring-data/mongodb/docs/1.2.0.RELEASE/reference/html/mongo.repositories.html
public interface Repository extends MongoRepository<ProductEntity, String> {   
}