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

Spring数据Mongodb批量保存继续出错,mongodb,spring-data-mongodb,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 mong

我使用的是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));
    }
}
使用的存储库扩展了crudepository,这使得我可以调用saveAll()方法。默认情况下,在mongodb中执行saveAll(大容量操作)将在一条记录失败时停止,除非向insertMany/updateMany命令传递了一个选项,将“continueOnError”设置为true或“BulkMode.unordered”。我有没有办法将spring数据配置为总是在出错时继续(或者总是执行无序插入/更新),这样即使某些记录失败,执行saveAll也总是会尝试整个批量


谢谢

要进行MongoDB批量写入(能够选择无序的op,从而允许在批量组中的一个项目失败后继续写入),您需要使用
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数据版本<1.9.0.RELEASE,则可以使用本机驱动程序对象:
DBCollection
(可通过
MongoOperations.getCollection()
)和go with标准驱动程序调用,例如:

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
}

我试图继续使用spring数据存储库提供的saveAll方法,不知道是否可以将其配置为始终使用无序模式。对于您的解决方案,我必须自己实现saveAll方法,这是我想要防止的。我只是想以某种方式将Spring配置为总是执行无序大容量插入,但这可能是不可能的。是的,目前Spring数据不可能做到这一点。我认为您必须实现自己的“批量感知”
saveAll()
,上面的答案提供了两种实现方法。在中,可以使用WriteConcern.continueOnError()设置此行为。然而,这已从api中删除。