2016-08-17 70 views
1

如何更新流星集合中的1000个文档,其中必须使用forEach来首先计算每个单独文档的更改?流星中的长时间运行的Mongo查询

有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',不明白为什么不。当你有很多cron作业要管理时,'synced-cron'很好。 –