2017-08-14 54 views
1

我使用弹簧数据mongodb的和具有简单的储存库,其被配置具有以下配置:弹簧数据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()方法。默认情况下,除非向insertMany/updateMany命令传递了“continueOnError”为true或具有“BulkMode.unordered”的选项,否则在mongodb中执行saveAll(批量操作)将停止。有没有什么办法可以将spring数据配置为在错误时始终继续(或者始终执行无序的插入/更新),这样,即使有些记录失败,执行saveAll也会尝试整个批量。

谢谢!

+0

在[旧版本的驱动程序的MongoDB的](http://api.mongodb.com/java/2.12/com/mongodb/WriteConcern.html#continueOnErrorForInsert(布尔值))是可能的设置此使用WriteConcern.continueOnError()的行为。然而,这从api中删除。 – user45

回答

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数据版本< 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 
} 
+0

我试图继续使用spring-data存储库提供的saveAll方法,并想知道我是否可以将其配置为始终使用无序模式。有了你的解决方案,我必须自己实现saveAll方法,这是我想要防止的。我只是想以某种方式配置Spring,以便始终执行无序批量插入,但可能无法完成。 – user45

+0

是的,这对Spring Data来说目前是不可能的。我想你必须用上面的答案来实现你自己的'bulk aware'saveAll()',为这个实现提供了两种方法。 – glytching