2013-11-27 63 views
2

我想通過一個循環插入幾個文檔,但是我遇到了ObjecId的唯一性問題。用Mongoskin將多個文檔插入到MongoDB中

我有這樣的功能:

// 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重複鍵錯誤指數:......」第一個文件被創建並插入之後。

問:爲什麼此環路嘗試每一個文檔中插入使用相同的對象ID,因此產生一個錯誤? 如何重寫這個以確保ObjectId每次都是隨機的?

回答

2

在第一次插入時,doc被修改爲具有新的_id字段。這意味着您需要在for循環的開始處將其重置,因爲如果已有文件,驅動程序不會向文檔添加新的_id值。

相關問題