我正在尝试找到一种更好的方法来确保在特定时间从 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
不需要扫描整个集合。 - 从技术上讲,如果它在多个服务器实例上运行,这不会中断,但理想情况下它只会在一个服务器实例上运行。也许它可以在自己的进程中运行。
关于javascript - 是否有一种标准方法可以使用 Meteor 和 moment.js 在某个时间从集合中删除 Mongo 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33657453/