[英]Is there a standard way to remove a Mongo document from a collection at a certain time using Meteor and moment.js?
我試圖找到一種更好的方法來確保在特定時間從mongo集合中刪除某些文檔,這對於每個文檔都是唯一的。 刪除項目時,我還需要運行一些方法。 我已經研究了TTL索引,但似乎它們不允許任何類型的回調,並且從我閱讀的內容來看,刪除文檔的過程每分鍾僅運行一次,這還不足以滿足我的需要。 以下是我的想法:
var check_frequency = 30000;
Meteor.setInterval((function() {
// figure out what elements will expire within the next check period
var next_check = moment().add(check_frequency, 'milliseconds');
var next_string = next_check._d.toISOString();
var ending_items = items.find({'time_to_end': {$lt : next_string}});
ending_items.forEach(function(db_object) {
var time_from_now = moment(db_object.time_to_end) - moment();
Meteor.setTimeout(function() {
removeAndReport(db_object._id);
}, time_from_now);
});
}), check_frequency);
我擔心的是我不確定
。 誰能推薦一種更好的方法來實現這一目標? Meteor.setTimeout()
如何與線程一起工作,因此,如果我有成百上千的調用,我想知道它是否會引起問題
提前致謝。
編輯:使用Meteor或cron運行后台作業不是我唯一關心的問題。 我意識到我可以通過cron作業來完成相同的事情,但是我寧願每秒查詢一次我的數據庫僅找到3個過期項,而不是每30秒查詢一次數據庫,並弄清楚哪些元素將在下一個時間段。
似乎更簡單的解決方案是將刪除日期存儲在每個文檔中,而不是TTL中。 假設您有一個名為Messages
的集合,並且每個文檔都有一個removeAt
字段。 然后,您可以執行以下操作:
var timeout = 500;
Meteor.setInterval((function() {
// remove any messages that should have been removed in the past
Messages.remove({removeAt: {$lte: new Date}});
}), timeout);
筆記:
removeAt
編制索引,以便remove
不需要掃描整個集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.