簡體   English   中英

是否存在使用Meteor和moment.js在特定時間從集合中刪除Mongo文檔的標准方法?

[英]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);

筆記:

  1. 確保為removeAt編制索引,以便remove不需要掃描整個集合。
  2. 從技術上講,如果它可以在多個服務器實例上運行,則不會輕易出錯,但理想情況下,它只能在一個服務器上運行。 也許可以在它自己的過程中運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM