2016-08-17 4 views
1

Как можно обновить 1000 документов в коллекции в метеоре, где forEach должен использоваться для первого вычисления изменений для каждого отдельного документа?Долгосрочные запросы Mongo в Meteor

Существует промежуток времени в 10 минут или около того, а также определенное количество мегабайт. То, что я делал в прошлом, разбивает обновления на группы по 300 и обновляет их. Но есть ли более простой способ сделать это в метеор, чтобы каждый цикл мог работать в течение часа?

+2

То, что я делал в прошлом, - это настроить пакетное задание, которое запускается cron. Есть несколько пакетов, которые вы можете использовать, как Meteor, так и NPM, которые позволяют вам настраивать задания. Таким образом, вы просто ставите в очередь работу, и запланированное задание выполняет эту работу. – CodeChimp

+0

Рекомендации для пакетных пакетов mongo с метеор? –

+0

Есть несколько на [atmosphere.js] (https://atmospherejs.com/?q=cron), и если вы находитесь в более поздней версии Meteor, то легко вытащить и пакет npm. Я думаю, что в моем проекте я использовал percolate: synced-cron, но я использовал Meteor 1.2, а модули npm были немного сложнее. Поэтому вместо этого я бы предложил просмотреть несколько популярных опций и посмотреть, что подходит вам. Для чего это стоит, я использовал этот совокупный набор данных из одной коллекции в другую для отчетности, но должен работать во многих экземплярах пакета. – CodeChimp

ответ

2

Используя percolate:synced-cron, вы можете легко сделать это партиями.

SyncedCron.add({ 
    name: 'Update mass quantities', 
    schedule: function(parser) { 
    // parser is a later.parse object 
    return parser.text('every 1 minute'); // or at any interval you wish 
    }, 
    job: function() { 
    var query = { notYetProcessed: true }; // or whatever your criteria are 
    var batchSize = { limit: 300 }; // for example 
    myCollection.find(query,batchSize).forEach(doc){ 
     var update = { $set: { notYetProcessed: false }}; // along with everything else you want to update 
     myCollection.update(doc._id,update); 
    } 
    } 
}); 

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

+0

Спасибо. Есть ли причина использовать synced-cron в отличие от 'Meteor.setInterval' в таком случае? Если все, что вы делаете, настраивает обновление каждую минуту, вы можете использовать «Meteor.setInterval» (если только вы не хотите делать это только на одном сервере) –

+0

Вы также можете использовать 'setInterval', I don ' почему бы и нет. 'synced-cron' хорош, когда у вас много заданий cron для управления. –

Смежные вопросы