以下のコマンド作業偉大な、そして必要に応じて、あなたが(すべての可能性がある)更新したいユーザーの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()
順序一括操作は順序(従って名)、 停止エラーがありますで実行されます。
順不同一括操作は、(潜在的に平行に)順不同で が実行され、エラーが発生したときに、これらの操作 は停止しません。
したがって、ここでは順序付けられていない一括更新を使用します。
これはすべて
このような更新を行う方法は多数あります。しかし、明確な解決策のためには、いくつかのサンプル文書構造と共に投稿を更新してください。参考までに、http://stackoverflow.com/help/mcve – Saleem
@Saleemをご覧ください。ありがとうございます。投稿が更新されました。 – securecurve
値上げの基準は何ですか?給料100はどのように300に上がったのですか?任意の数式ですか?パーセンテージ? – Saleem