2011-03-03 48 views
3

我期待学习node.js和mongodb,它们看起来适合我想要做的事情。作为一个帮助我学习的小项目,我认为我需要从phpbb3论坛复制“posts”表到mongodb表中,所以我做了类似这样的事情,其中​​db是mongodb数据库连接,client是mysql数据库连接。通过node.js中的数据库记录进行迭代

db.collection('posts', function (err, data) { 
    client.query('select * from phpbb_posts", function(err, rs) { 
     data.insert(rs); 
    }); 

该工程确定,当我做小表,但我的职位表中有10多万行,当我离开它运行了一个小时该查询甚至不回来。我怀疑它试图将整个数据库表加载到内存中,然后插入它。

所以我想要做的是一次读一大块行并插入它们。然而,我看不到如何读取node.js中的行的子集,甚至更多的问题,我无法理解如何通过回调获取通知时,我可以一次遍历查询它已完成。

任何想法如何我最好做到这一点? (我正在寻找使用node.js的解决方案,因为我想知道如何解决这类问题,我毫无疑问可以用其他方式轻松完成)

+1

两个问题:1.你的“选择”是否是一个错字?我看到一个单引号和一个双引号。 2.当你做限制10时会发生什么?或限制1?这个过程是否至少适用于小数据集? – 2011-03-03 22:09:48

+0

对不起,我稍微简化了查询并发布了错字。我可以做一个10或甚至1000的限制,这工作正常。但之后它变得越来越慢。 – jcoder 2011-03-03 22:36:12

回答

1

您可以尝试使用caolan的asnyc library。该库实现了一些异步流控制方法,以处理面向回调的编程风格的警告,就像它在node.js中一样。

对于你的情况,使用whilst方法可以解决,使用针对MySQL的LIMIT查询并将它们插入到mongodb中。

例(未测试,因为我没有TESTDATA可用,但我想你会明白我的意思)

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。

+0

看起来很有趣,我会研究它。 – jcoder 2011-03-04 15:39:02