mongodb - Spring data Mongodb bulk save continue on error

标签 mongodb spring-data-mongodb

我正在使用 spring-data-mongodb 并有一个简单的存储库,该存储库配置有以下配置:

@Configuration
@EnableMongoRepositories(basePackages = "com.my.package")
@Profile("default")
public class MongoConfig extends AbstractMongoConfiguration {

    @Value("${mongo.db.uri}")
    private String mongoDbUri;
    @Value("${mongo.db.database}")
    private String mongoDbDatabaseName;

    @Override
    protected String getDatabaseName() {
        return mongoDbDatabaseName;
    }

    @Override
    public MongoClient mongoClient() {
        return new MongoClient(new MongoClientURI(mongoDbUri));
    }
}

使用的存储库扩展了 CrudRepository,这使得我可以调用 saveAll() 方法。默认情况下,在 mongodb 中执行 saveAll(批量操作)将在一条记录失败时停止,除非将选项传递给 insertMany/updateMany 命令以将“continueOnError”设置为 true 或设置“BulkMode.unordered”。有什么方法可以将 spring 数据配置为始终在出错时继续(或始终执行无序插入/更新),以便执行 saveAll 将始终尝试整个批量,即使某些记录失败?

谢谢!

最佳答案

要进行 MongoDB 批量写入(能够选择无序操作,这反过来允许写入继续,即使批量组中的一个项目失败)你需要使用 org.springframework.data .mongodb.core.BulkOperations(可从 Spring Data >= 1.9.0.RELEASE 获得)

例如:

BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkMode.UNORDERED, YourDomainObjectClass.class);
for (YourDomainObject ydo : yourDomainObjects) {
    bulkOperations.insert(ydo);
}
BulkWriteResult result = bulkOperations.execute();
// inspect the result
if (result.getInsertCount() != yourDomainObjects.size()) {
    // oh oh
}

如果您使用的是 Spring Data 版本 < 1.9.0.RELEASE,那么您可以使用 native 驱动程序对象:DBCollection(可通过 MongoOperations.getCollection() 获得)和使用标准驱动程序调用,例如:

BulkWriteOperation bulkWriteOperation = collection.initializeUnorderedBulkOperation();
for (YourDomainObject ydo : yourDomainObjects) {
    bulkWriteOperation.insert(ydo);    
}
BulkWriteResult result = bulkWriteOperation.execute();
// inspect the result
if (result.getInsertCount() != yourDomainObjects.size()) {
    // oh oh
}

关于mongodb - Spring data Mongodb bulk save continue on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45672290/

相关文章:

MongoDB 和 RDF

mongodb - 关于mongodb子文档和spring-data-mongo查询的问题

java - MongoRepository findOne 使用 "id"而不是 "_id"

Spring 数据 MongoDB : How to describe aggregation $merge with Spring Aggregation?

node.js - 如何在mongo Mongo中使用$in

c# - 在 MongoDB 的 _v 属性之外存储 JSON 数据

java - MongoDb Java 驱动程序 v3.x 和聚合框架

c++ - 如何使用 C++ 在 MongoDB 中编写简单的查询?

java - Spring MVC MongoDB 配置

java - @QuerydslPredicate 在 Spring 测试中在 standaloneSetup 中失败