Spring数据Mongodb批量保存继续出错

时间:2017-08-14 10:16:25

标签: 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"为真或有" BulkMode.unordered"。有没有什么方法可以配置弹簧数据总是继续出错(或者总是进行无序的插入/更新),这样即使一些记录失败,执行saveAll总是会尝试整个批量?

谢谢!

1 个答案:

答案 0 :(得分:0)

要使用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然后您可以使用本机驱动程序对象: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
}