2016-05-30 11 views
1

私たちは、すべての従業員に給与アップグレードがあるとします。給与はすべての人に固定されておらず、同じ従業員文書のいくつかのフィールドに依存します。たとえば、給与をすべてマンゴ文書(従業員1人当たり) 1つのコマンドで?更新MongoDBの複数のドキュメントを、1つのコマンドで同様の更新条件で更新するにはどうすればよいですか?

サンプル文書

を{私は従業員IDまたは名前、および給与のアップグレードを持って考えてみましょう、と1つのコマンドですべての文書を更新します _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"} ]) 

の欠点上記のコマンドは、新しい更新されたフィールドを挿入するために新しいコレクションを持たなければならないということです。既存のコレクション(この場合は給与)に名前を付けると、既存のフィールドがすべて削除され、新しい給与計算中に他の操作が発生した可能性があるためです。

より良いアプローチ

行うには良いことは、私たちのエキサイティングコレクションにバッチ更新を行うには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() 

順序一括操作は順序(従って名)、 停止エラーがありますで実行されます。

順不同一括操作は、(潜在的に平行に)順不同で が実行され、エラーが発生したときに、これらの操作 は停止しません。

したがって、ここでは順序付けられていない一括更新を使用します。

これはすべて

関連する問題