mongodb nodejs多插入问题

时间:2013-07-02 16:08:43

标签: javascript node.js mongodb

我正在尝试将一个表从mysql直接导入mongodb而不进行任何架构更改。

我为此编写了一个小节点脚本,问题在于我实现它的方式。

也许我在循环中使用mongo db insert limit时遇到了一些限制。 我认为这个问题不会发生,如果反过来(可能不是!)

所以这就是事情。 mysql表中的行超过100,000,但当循环命中超过30000时,插入项的数量就会减少。

所以让我们假设如果使用下面提到的脚本完成导入后mysql表中有100,000个项目,我最多只能得到37000左右。

我的强烈怀疑是在节点脚本/节点mongodb连接器中,或脚本中的一些错误,或者最后是mongodb并发数据库插入的限制。

我正在粘贴下面的脚本。 希望我能绕过它。

谢谢,

var http = require('http'),
  mysql = require('mysql'),
  mongo = require('mongodb').MongoClient,
  format = require('util').format;
var connection = mysql.createConnection({
  user: "xxx",
  password: "xxx",
  database: "mydb" 
});

connection.connect();
var query = "select * from mytable";
var mysqlrows = '';
connection.query(query, function(err,rows,fields){
  if(err) throw err;

  console.log(rows.length+'rows found.');

  mongo.connect('mongodb://root:root@127.0.0.1:27017/mydb', function(err, db){ 
    if (err)
      throw err;

    var collection = db.collection('mytable');
    for(var i=0; i<rows.length;i++)
    {
       //console.log(JSON.stringify(rows[i]));

      (function(i){
        collection.insert(rows[i],function(err,docs){});
        console.log(i);
      })(i);
    }

    db.close();        
  });    
});
connection.end();

2 个答案:

答案 0 :(得分:2)

问题是,在通过insert调用关闭与MongoDb的连接之前,您不是在等待db.close();操作完成。您需要跟踪未完成的异步请求,然后仅在完成所有请求后调用db.close();

答案 1 :(得分:0)

要确保从mySQL获取所有数据,请尝试访问最后一行。如果你能得到它,使用mongodb的标志w和j来确保每个调用在移动到下一个之前插入数据。使用w和j标志,您应该考虑多次插入,方法是在每次调用时使用和数组插入多行。