Java MongoDB一次保存多个文档
我有一个更新对象/文档的列表,需要立即保存列表中的所有对象 我在MongoTemplate中看到了save(),但它可以一次保存一个文档。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(“您的集合名称”)。插入(列表) 您可能还想签出类。有
有没有办法一次保存多个文档,或者我需要调用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> {
}