我使用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总是会尝试整个批量?
谢谢!
答案 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
}