我有一个更新的对象/文档列表,我需要一次保存列表中的所有对象。
我在MongoTemplate中看到了save(),但它一次只能获取单个文档。 有没有办法一次保存多个文件,或者我需要在循环中调用save?
答案 0 :(得分:2)
感谢您的帮助。
我能够使用Spring数据MongoDB来完成它。 Spring数据MongoDB的MongoRepository有许多内置方法。
org.springframework.data.mongodb.repository.MongoRepository.saveAll(Iterable entites) 是我用来保存多个文件的那个。
答案 1 :(得分:1)
使用Spring,您可以轻松地一次存储多个文档。
接口已经可以使用方法saveAll和详细信息,如下所示:
END
春季用法示例:
@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);
//...
}
您的存储库界面:
@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());
}
}
带有“产品”实体“列表”的调用保存方法
答案 2 :(得分:1)
您可以使用 insertAll
中的 MongoTemplate
或 ReactiveMongoTemplate
,但必须谨慎使用。它做它的名字所代表的 - 它插入所有文档。如果您调用 save
方法,则 save
具有乐观锁定,因此它会检查您是否不覆盖不应该覆盖的文档(如果它具有 @Version
批注)。 insertAll
不检查乐观锁定,因此只要您确实想要进行插入,就可以使用它,例如持久化尚未持久化的文档,或者您不关心覆盖这些文档和乐观锁定。如果您关心乐观锁定,那么您所能做的就是为每个文档调用 save
,这将生成大量 I/O 操作,但这就是确保您将更新具有匹配版本的文档所需要的。
此外,您必须记住 insertAll
实际上插入了新文档,这意味着您无法使用此方法更新文档,因为您将获得重复键异常。目前 spring mongo 缺少允许更新所有文档的功能(您只能“插入”它们,因此第一次保存)
答案 3 :(得分:0)
这是一种方法。
mongoTemplate.getCollection("your_collection_name").insert(List<Documents>)
您可能还想查看BulkWriteOperation课程。
答案 4 :(得分:0)
对于插入:
你应该使用函数InsertMany,如:
List<Document> docList = new List<Document>();
docList.add(doc1); // assuming that doc1 and doc2 are defined
docList.add(doc2);
yourMongoDb.getCollection("your_collection").insertMany(docList);
For Upsert(你需要什么):
UpdateOptions options = new UpdateOptions().upsert(true) ;
yourCollectionOfDocuments.forEach( doc ->{
Document filter = Filters.eq("_id", doc.get("id"));
yourDb.getCollection("your_collection").updateOne(filter,update,option);
})