2012-09-24 20 views
0

以下代碼嘗試從csv文件加載到在本地主機上運行的mongodb實例。Node.js代碼加載不一致到mongodb

問題 - 它在每次運行時加載不同數量的文檔(始終少於csv中的記錄總數)。

var csv = require('csv'); 

var server = new Server('localhost', 27017, {auto_reconnect: true, poolSize: 1}); 
var db = new Db('test', server); 

db.open(function(err, db, onemore) { 
    if(!err) { 
    //Database connection is established. 
    db.collection('teststocks', function(err, collection) { 
     if(!err) { 
     // Stocks collection is connected, open the file and insert the doc 
     console.log("Trying to load from " + process.argv[2]); 
     csv() 
      .fromPath(process.argv[2], { 
      columns: true 
      }) 
      .on('data', function(data, index) { 
      //data.stock = process.argv[2].substring(process.argv[2].lastIndexOf('/') + 1, process.argv[2].lastIndexOf('.')); 
      collection.insert(data, {safe: true}, function(error, collection){ 
        if (error) { console.log("Error inserting record : " + error); } 
      }); 
      console.log("Inserted data for " + index); 
      }) 
      .on('error', function(error) { 
      db.close(); 
      console.log("Error: " + error); 
      }) 
      .on('end', function(count) { 
      console.log("Finished all writing."); 
      db.close(); 
      }); 
     } 
    }); 
    } 
}); 

P.S:我能夠加載使用mongoimport實用,但作爲一個初來乍到的Node.js和MongoDB的數據;我想了解我在上面的代碼中犯的錯誤。

+0

您是否收到任何錯誤消息? –

+0

不,沒有錯誤信息。 –

回答

2

這很可能是因爲您在csv()讀完後關閉數據庫連接。但是,由於collection.insert是異步的,因此不能保證在完成csv並調用db.close()之前每個呼叫都已完成。

一種選擇是收集csvdataArray,然後insert所有的人都在一次:

var docs = []; 

csv() 
    // ... 
    .on('data', function (data, index) { 
    docs.push(data); // or possibly: docs[index] = data; 
    }) 
    // ... 
    .on('end', function() { 
    console.log("Finished reading CSV.");  

    collection.insert(docs, { safe: true }, function (error, inserted) { 
     console.log("Finished all writing."); 
     db.close(); 
    }); 
    }); 
+0

感謝您的迴應,但我認爲安全:真正的力量聲明等待db的插入確認? –

+1

@RishabhSagar儘管安全選項不會強制連接保持打開狀態。它隻影響傳遞給'insert'的回調函數,通過確保它被稱爲「[*將記錄保存到數據庫後*](http://mongodb.github.com/node-mongodb-native/markdown-docs /insert.html#insert)。」 –

+0

是的,看起來問題是早期執行db.close(),猜猜我還沒有把我的頭包裝在異步編程中。謝謝你的幫助。 –