迭代node.js中的数据库记录

时间:2011-03-03 21:42:09

标签: mongodb node.js

我正在学习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的解决方案,因为我想知道如何解决这类问题,我无疑可以通过其他方式轻松实现)

1 个答案:

答案 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。