簡體   English   中英

如何在一個命令中使用非類似更新條件更新MongoDB中的多個文檔?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM