Java MongoDB一次保存多个文档

时间:2018-06-06 11:07:24

标签: mongodb spring-data-mongodb mongo-java mongo-java-driver mongotemplate

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

我在MongoTemplate中看到了save(),但它一次只能获取单个文档。 有没有办法一次保存多个文件,或者我需要在循环中调用save?

5 个答案:

答案 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 中的 MongoTemplateReactiveMongoTemplate,但必须谨慎使用。它做它的名字所代表的 - 它插入所有文档。如果您调用 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); 
})