2

ループを介して複数のドキュメントを挿入しようとしていますが、ObjecId の一意性に問題があります。

私はこの機能を持っています:

// Fetch all client documents. 
db.collection('clients').find({}, {cost: 1}).toArray(function(err, dbDocs) {
  if (err) throw err; 

  // Set up a general doc.
  var currentTime = new Date();
  var doc = {
    year: currentTime.getFullYear(), 
    quarter: Math.floor(currentTime.getMonth() / 3) + 1, 
    paid: false
  };

  // For each client document, insert a document to invoices collection.
  for (var i = 0, j = dbDocs.length; i < j; i += 1) { 
    doc.quarterCost = (dbDocs[i].cost.monthly * 3);
    doc.client_id = dbDocs[i]._id;

    db.collection('invoices').insert(doc, function(err, result) {
      if (err) throw err; 
      if (result) console.log('Invoice created');
    });
  }
}); 

最初のドキュメントが作成されて挿入された後、「mongoError: E110000 Duplicate key error index: ...」が表示されます。

質問: このループが同じ ObjectID を持つすべてのドキュメントを挿入しようとするため、生成エラーになるのはなぜですか? ObjectId が毎回ランダムになるようにこれを書き直すにはどうすればよいですか?

4

1 に答える 1

2

最初の挿入でdoc、新しい_idフィールドを持つように変更されます。つまり、既に値が存在する場合、ドライバーはドキュメントにfor新しい値を追加しないため、ループの開始時に値をリセットする必要があります。_id

于 2013-11-27T12:44:29.140 に答える