下面的命令工作的高度,並可根據需要做必要的操作,考慮到你有用戶ID或要更新的名單(可能是全部)
db.salaries.aggregate([ {$match : { _id:{$in:[ObjectId("563e1d9d04aa90562201fd5f"),ObjectId("564657f88f71450300e1fe0b")]} } } , {$project: { rating: {$divide:["$metric_1","$metric_2"]} } } , {$out:"new_salaries"} ])
的缺點上面的命令是你必須有一個新的集合來插入新的更新字段,並且如果命名現有集合(在這種情況下是工資),它將刪除所有現有字段,並只添加新計算的文檔,這對於不安全這樣做,因爲在新的薪金計算過程中可能發生了其他操作。
更好的方法
更好的事情做的是匯聚流水與蒙戈的批量操作結合起來,做批量更新我們的退出集合。通過這種方式:
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()
有序批量操作的順序(因而名稱), 停止時,有一個錯誤被執行。
無序批量操作被(可能並行地)執行 沒有特定的順序和在發生錯誤時這些操作 不停止。
因此,我們在這裏使用無序批量更新。
這就是全部
有很多方法來做這種更新。但是,爲了獲得清晰的解決方案,請更新您的文章以及一些示例文檔結構。有關參考請參閱http://stackoverflow.com/help/mcve – Saleem
@Saleem,感謝您的評論。發佈更新。 – securecurve
什麼是價值增加的標準。薪酬100如何高達300?任何數學公式?任何比例? – Saleem