0

Mongoskin を使用して Node/Express/MongoDB でアプリを構築しています。このアプリには、毎月初めに実行されるスケジュール機能があります。

この関数は、次のコードで構成されています。

clients.find({}, {cost: 1, invoices: 1 }).toArray(function(err, dbDocs) {
  if (err) throw err; 

  // Set up a current time variable and a general populated invoice object.
  var currentTime = new Date();
  var invoice = {
    year: currentTime.getFullYear(), 
    quarter: Math.floor(currentTime.getMonth() / 3) + 1, 
    paid: false
  };

  // Loop trough the fetched documents.
  for (var i = 0, j = dbDocs.length; i < j; i += 1) { 
    invoice.quarterCost = (dbDocs[i].cost.monthly * 3);

    clients.update({_id:dbDocs[i]._id}, {$push:{ invoices: invoice }}, function(err, result) {
      if (err) throw err; 

      console.log('LogCost created new client invoice')
    ));
  }
});

この関数は、最初にデータベースから利用可能なすべてのクライアント ドキュメントをクエリし、次にこのデータを使用してすべてのクライアントの新しい請求書オブジェクトを作成し、この請求書をクライアントの請求書配列にプッシュしてデータベースに保存します。

現在、ループ内に更新があります。つまり、更新するクライアントが多数ある場合、単一の更新クエリが多数発生します。おそらく 100 ~ 200 を超えるクライアントは期待できません。

質問:この関数と更新クエリを構造化するより良い方法はありますか? 私を悩ませているのは、ループ内の単一のドキュメント更新クエリです...しかし、おそらくこれが正しい方法です。

4

0 に答える 0