2016-08-17 83 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'很好。 –