2017-08-14 59 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