使用Mongoskin将多个文档插入MongoDB

时间:2013-11-27 12:37:34

标签: node.js mongodb mongoskin

我试图通过循环插入几个文档,但是我对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重复键错误索引:...”。

问题: 为什么这个循环试图插入具有相同ObjectID的每个文档,因此生成错误? 如何重写以确保ObjectId每次都是随机的?

1 个答案:

答案 0 :(得分:2)

在第一次插入时,doc被修改为具有新的_id字段。这意味着您需要在for循环开始时重置它,因为如果文档已经存在,则驱动程序不会向文档添加新的_id值。