我正在尝试将一个表从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();
答案 0 :(得分:2)
问题是,在通过insert
调用关闭与MongoDb的连接之前,您不是在等待db.close();
操作完成。您需要跟踪未完成的异步请求,然后仅在完成所有请求后调用db.close();
。
答案 1 :(得分:0)
要确保从mySQL获取所有数据,请尝试访问最后一行。如果你能得到它,使用mongodb的标志w和j来确保每个调用在移动到下一个之前插入数据。使用w和j标志,您应该考虑多次插入,方法是在每次调用时使用和数组插入多行。