0

次のコードは、csvファイルからローカルホストで実行されている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();
          });
      }
  });
  }
});

PS:mongoimportユーティリティを使用してデータをロードすることはできますが、node.jsとmongodbの初心者です。上記のコードで私が犯している間違いを理解したいと思います。

4

1 に答える 1

2

csv()読み取りが終了した後にデータベース接続を閉じていることが原因である可能性があります。ただし、collection.insert非同期の場合と同様に、各呼び出しが完了して呼び出される前に終了する保証はありませcsvdb.close()

1つのオプションは、をに収集しcsv dataArray次に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();
    });
  });
于 2012-09-24T18:01:09.897 に答える