我正在学习node.js和mongodb,它们看起来很适合我想制作的东西。作为一个帮助我学习的小项目,我以为我会将phpbb3论坛中的“posts”表复制到mongodb表中,所以我做了类似这样的事情,其中db是mongodb数据库连接,而client是mysql数据库连接。
db.collection('posts', function (err, data) {
client.query('select * from phpbb_posts", function(err, rs) {
data.insert(rs);
});
当我在小表上执行此操作时,这可以正常工作,但我的posts表中有大约100000行,即使我让它运行一小时,此查询也不会返回。我怀疑它正在尝试将整个数据库表加载到内存中然后插入它。
所以我想做的是一次读取一大块行并插入它们。但是我看不到如何读取node.js中的行的子集,甚至更多的问题,我无法理解当我只通过回调获取通知时,我可以一次迭代查询一次它已经完成了。
我有什么想法可以做到最好吗? (我正在寻找使用node.js的解决方案,因为我想知道如何解决这类问题,我无疑可以通过其他方式轻松实现)
答案 0 :(得分:1)
您可以尝试使用caoran asnyc library。该库实现了一些异步流控制方法来处理面向回调的编程风格的警告,就像在node.js中一样。
对于您的情况,使用whilst
方法可以解决问题,使用针对mysql的LIMIT查询并将它们插入到mongodb中。
示例(未经测试,因为我没有可用的测试数据,但我认为你会明白这一点)
var insertCount = 0;
var offset = 0;
// set this to the overall recordcound from mysql
var recordCount = 0;
async.whilst(
// test condition callback
function () { return insertCount < recordCount; },
// actual worker callback
function (callback) {
db.collection('posts', function (err, data) {
client.query('select * from phpbb_posts LIMIT ' + insertCount + ',1000', function(err, rs) {
data.insert(rs);
// increment by actually fetched recordcount (res.length?)
insertCount += res.length;
// trigger flow callback
callback();
});
});
},
// finished callback
function (err) {
// finished inserting data, maybe check record count in mongodb here
}
});
正如我已经提到的,这段代码只是改编自异步库自述文件的一个例子。但也许可以选择将这样数量的数据库记录从mysql添加到mongo。