Итерация по записям базы данных в node.js - PullRequest
3 голосов
/ 04 марта 2011

Я хочу изучить node.js и mongodb, которые выглядят подходящими для того, что я хотел бы сделать.В качестве небольшого проекта, помогающего мне учиться, я подумал, что скопирую таблицу «posts» из моего форума phpbb3 в таблицу mongodb, поэтому я сделал что-то вроде этого, где db - это соединение с базой данных mongodb, а client - это соединение с базой данных mysql.

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

это работает нормально, когда я делаю это для небольших таблиц, но моя таблица сообщений содержит около 100000 строк, и этот запрос не возвращается, даже если я оставляю его в течение часа.Я подозреваю, что он пытается загрузить всю таблицу базы данных в память и затем вставить ее.

Так что я хотел бы сделать, это прочитать кусок строк за раз и вставить их.Однако я не могу понять, как читать подмножество строк в node.js, и даже больше проблем, я не могу понять, как я могу выполнять запросы по одному, когда я получаю уведомление только через обратный вызовчто это закончено.

Есть идеи, как мне лучше всего это сделать?(Я ищу решения, использующие node.js, так как я хотел бы знать, как решить эту проблему, без сомнения, я мог бы легко сделать это другим способом)

1 Ответ

1 голос
/ 04 марта 2011

Вы можете попробовать использовать библиотеку asnyc от caolan.Библиотека реализует некоторые асинхронные методы управления потоком для обработки предостережений стиля ориентированного на обратный вызов, как это делается в node.js.

В вашем случае использование метода whilst может сработать, используя запросы LIMIT.против mysql и вставки их в 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
  }
});

Как я уже упоминал,этот код только адаптирован из примера readme асинхронной библиотеки.Но, возможно, это вариант добавления такого количества записей базы данных из mysql в mongo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...