Mongodb 遍历node.js中的数据库记录

Mongodb 遍历node.js中的数据库记录,mongodb,node.js,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) {

我希望学习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的解决方案,因为我想知道如何解决这类问题,毫无疑问,我可以用其他方法轻松地解决)

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

对于您的情况,使用
while
方法可以解决问题,对mysql使用限制查询并将其插入mongodb

示例(未测试,因为我没有可用的测试数据,但我想你会明白的)

var insertCount=0;
var偏移=0;
//将其设置为mysql中的整体recordcound
var-recordCount=0;
异步的(
//测试条件回调
函数(){return insertCount

正如我已经提到的,这段代码只是根据异步库自述的一个示例改编而成。但也许这是一种将如此多的数据库记录从mysql添加到mongo的选择。

两个问题:1。你的“选择”中有错吗?我看到一个单引号和一个双引号。2.当你限制10时会发生什么?还是限制1?这个过程至少对小数据集有效吗?是的,对不起,我稍微简化了发布的查询,并输入了一个错误。我可以做一个限制10甚至1000,这是正常的。但在那之后,它变得越来越慢。这看起来很有趣,我会研究它。
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
  }
});