2016-04-15 76 views
0

我有一個情況,其中說1000名員工(示例如下)的清單,其平衡在每個月末更新,其中每個員工的餘額可能不同。spring數據MongoDB在批量更新中維護數據完整性

{ 
    _id:1 
    name:"John" 
    balance:40 
}, 

現在什麼是最好的做法來執行相同的。通過一個

for (Employee employee : employeeList) { 
     employee.update(); 
    } 

dropAll employees where id in (All employees ids) 
mongoOperations.insert(employeeList, Employee.class); 

或第三種方法執行它一個可能是

Load all employee records. 
Insert employee records to a new collection say employee_temp. 
Drop old collection (employee). 
Rename newly inserted collection as old one (employee). 

或者是他們能夠保證數據庫的數據完整性取得最大的成功機會,以及其他任何方式從性能角度來看是好的

回答

0

用你的第一種方法。一個接一個地做。而不是保存整個對象使用atomic updates這將表現更好。

Query query = Query.query(Criteria.where("id").is(id)); 
Update update = Update.update("balance", balance); 
mongoTemplate.findAndModify(query, update, FindAndModifyOptions.options().returnNew(true), Employee.class); 

你的第二個和第三個不會縮放。在運行時丟棄集合是不可取的。重命名集合有它的limitations

+0

我同意你關於可伸縮性的第二點。第一種方法的問題是原子更新保證只更新單個文檔,或者如果我需要將相同的餘額值更新爲多個對象,它仍然可以正常工作,但是如果不同的員工有不同的餘額,我們無法在單個查詢中指定它們導致執行多個查詢,從而取消原子性的保證。 – tarunkumar

0

我們最終解決的另一種可能的方法是將自定義檢查點保存在mongo中以進行回滾或提交任何必要的信息(因爲我們的數據規模很小,只有1000名員工),我們首先創建一個包含新舊狀態,並在開始批量更新之前先保存它。如果第一次記錄插入成功,我們至少有可以回滾的DB狀態,或者在出現故障時進一步嘗試重新執行批量更新。

如果批量更新過程成功完成,我們會刪除我們的檢查點集合,如果失敗,我們會重新執行對新值與僱員記錄不匹配的所有記錄的更新。

但是,如果你的設計允許,最好去混合DB,其中保存一些關係數據庫中的事務數據和休息依賴mongo。