我正在使用 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/