2

我正在尝试将表从 mysql 直接导入到 mongodb,而无需任何架构更改。

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

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

事情就是这样。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();
4

2 回答 2

2

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

于 2013-07-02T20:48:38.123 回答
0

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

于 2013-07-02T16:24:24.490 回答