[英]How do I update multiple documents in MongoDB with non similar update criteria in one command?
考慮我們對所有員工進行薪資升級,其中薪資增加並非固定在所有員工身上,而且取決於同一員工文檔中的某些字段,如何將所有工資更新為mongo文檔(每個員工一個)命令?
更新
考慮我有員工ID或名稱,以及工資升級,並希望用一個命令更新所有文檔
樣本文件
{_id:“11111”,薪水: (metric_1 / metric_2) ,姓名:“Androw”,metric_1:12345,metric_2:222,
... }
{_id:“22222”,薪水: (metric_1 / metric_2) ,姓名:“John”,metric_1:999,metric_2:223, ... }
其中metric_1和metric_2是與用戶互動相關的隨機因素,而工資是它們的函數。
以下命令工作得很好,並且可以根據需要執行所需的操作,考慮到您有一個用戶ID或要更新的名稱列表(可能全部)
db.salaries.aggregate( [ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]} } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } , {$out:"new_salaries"} ] )
上述命令的缺點是你必須有一個新的集合來插入新的更新字段,如果命名現有的集合(在這種情況下是工資),它將刪除所有現有的字段,只需添加新計算的文檔,這是不安全的,因為在新的工資計算期間可能發生了其他操作。
更好的方法
更好的辦法是將聚合流水線與mongo的批量操作結合起來,對我們現有的集合進行批量更新。 這條路:
var salaries_to_update = db.salaries.aggregate( [ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]} } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } ] )
然后我們進行批量更新操作,它會立即進行批量更新,而無需來回處理大量處理和流量問題。
var bulk = db.salaries.initializeUnorderedBulkOp()
salaries_to_update.forEach(salary){
bulk.find( _id: salary._id).updateOne({$set:{salary:salary.salary}})
}
bulk.execute()
有序批量操作按順序執行(因此名稱),在出現錯誤時暫停。
無序批量操作不按特定順序執行(可能並行執行),並且在發生錯誤時這些操作不會停止。
因此,我們在這里使用無序批量更新。
就這樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.