2016-05-30 47 views
1

考慮我們有薪水升級給所有員工,薪金增加不是固定給所有人,而是取決於同一員工文檔中的一些字段,我如何將所有薪水更新爲mongo文檔(每個員工一個)用一個命令?如何在一個命令中使用非相似的更新條件更新MongoDB中的多個文檔?

更新

考慮我的員工ID或名稱,工資升級,並希望用一個命令來更新所有的文件

樣本文件

{ _id:「11111」, 工資:(metric_1/metric_2), 名: 「Androw」, metric_1:12345, metric_2:222,
... }

{ _id: 「22222」, 工資:(metric_1/metric_2), 名稱: 「約翰」, metric_1:999, metric_2:223, ... }

其中metric_1和metric_2是與用戶交互相關的隨機因素,薪水是它們的函數。

+0

有很多方法來做這種更新。但是,爲了獲得清晰的解決方案,請更新您的文章以及一些示例文檔結構。有關參考請參閱http://stackoverflow.com/help/mcve – Saleem

+0

@Saleem,感謝您的評論。發佈更新。 – securecurve

+0

什麼是價值增加的標準。薪酬100如何高達300?任何數學公式?任何比例? – Saleem

回答

0

下面的命令工作的高度,並可根據需要做必要的操作,考慮到你有用戶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() 

有序批量操作的順序(因而名稱), 停止時,有一個錯誤被執行。

無序批量操作被(可能並行地)執行 沒有特定的順序和在發生錯誤時這些操作 不停止。

因此,我們在這裏使用無序批量更新。

這就是全部

相關問題