Вставка нескольких документов в MongoDB с помощью Mongoskin

Я пытаюсь вставить несколько документов через цикл, но у меня возникает проблема с уникальностью ObjectId.

У меня есть эта функция:

// 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 каждый раз был случайным?


person Anders Östman    schedule 27.11.2013    source источник


Ответы (1)


При первой вставке doc изменяется, чтобы иметь новое поле _id. Это означает, что вам нужно сбросить его в начале цикла for, поскольку драйверы не добавляют новое значение _id в документ, если оно уже есть.

person Derick    schedule 27.11.2013