2015-05-27 73 views
1

後無法正常使用的NodeJS上的MongoDB +一個簡單的腳本一些奇怪的情況。的NodeJS,MongoDB的更新陣列插入許多

我從CSV文件中讀取數據,並用數據做操作後,我想將數據保存到MongoDB的。一切工作正常使用單個插入,但有更好的表現,我想用插入很多,所以這裏是我的腳本:

AssertionError: {"name":"MongoError","message":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: databasename.peoples.$_id_ == null ... 

parser.on('readable', function(){ 
while(record = parser.read()){ 
    ... 
    // Saving data in a buffer 
    buffer.push({ 
    'name': cleared_name, 
    'source': source, 
    'notes': notes, 
    'address': address[0] 
    }) 

    // If buffer is more that 100 or we rich end of csv file - insert data into mongodb 
    if(buffer.length >= 100 || readAllLines) { 
     db.collection('peoples').insert(buffer, {w: 1, forceServerObjectId: false}, function(err, result) { 
     lineCount -= result.insertedCount; 

     // Close db connection if we insert all data 
     if (lineCount === 0 && readAllLines) { 
      db.close() 
     } 
     // Lets check what is in buffer right now 
     console.log(buffer) 
     // Clear buffer 
     buffer.length = 0; 
     buffer = [] // or delete buffer; 
     }); 
    } 
} 
}) 

插入200行,MongoDB中給我的錯誤後,和緩衝器陣列將包含數據:

[{ name: 'kelly', 
source: 'Forbes.com', 
notes: 'Scraped from box XX', 
address: '104.236.115.138', 
_id: 5565c77d8533c30967b5b278 }, 
{ name: 'kas', 
source: 'Forbes.com', 
notes: 'Scraped from box XX', 
address: '184.168.221.28', 
_id: 5565c77d8533c30967b5b279 }, 
{ name: 'alle', 
source: 'Forbes.com', 
notes: 'Scraped from box XX', 
address: '82.118.66.19', 
_id: 5565c77d8533c30967b5b27a }... 
] 

即使我設置forceServerObjectId爲false插入在緩衝器陣列,mongodb的集_id。有沒有可能阻止這種情況? 我該如何清除緩衝區變量?

我猜緩存中還有一個已經插入的數據,因爲相同的ID是已存在於數據庫蒙戈給錯誤的問題(但我不知道,我右100%)

感謝答覆

回答

0

僅當存在數據庫中的一些_id文檔可能會出現錯誤,說ID1,而你試圖插入其中有ID1作爲其_id字段值一個新的文檔。

這可能是因爲以下幾點:

  • 您已經在收集一些文件,並有收集和CSV文件共享相同_id
  • 有隻是在一個文件在CSV文件中至少有兩行共享相同_id

如果_id字段的值是不適合你的關鍵,你可以從CSV裏讀出你的對象刪除屬性ght在您的JavaScript代碼中使用delete

否則,你有衝突,需要決定你想重複_id文件做什麼。如果你都OK的方式覆蓋,你可以通過具有{upsert: 1}選項,將用新值更新文檔中的情況下,如果有一個具有相同_id現有實現這一目標。

+0

更新緩衝區正如你可以從上面的代碼看 - 我不是推到_id緩衝,並且csv沒有_id字段。 _Id在第一次做insertMany後出現在緩衝區中。 – user1341596

+0

好吧,我明白了。那麼什麼是'domainystem.domain'? – bagrat

+0

運行錯誤的數據庫 - 更新 – user1341596

0

與封閉的固定緩衝區:

if(buffer.length >= 100 || readAllLines) { 
    (function(buffer) { 
     db.collection('peoples').insert(buffer, ... 
    }) 
    buffer = [] 
} 

但仍然在尋找解決方案 - 如何在不插入