有没有一种标准方法可以使用Meteor和moment.js在特定时间从集合中删除Mongo文档?

时间:2015-11-11 18:33:05

标签: javascript mongodb meteor ttl

我正在尝试找到一种更好的方法来确保在特定时间从mongo集合中删除某些文档,这对每个文档都是唯一的。我还需要在删除项目时运行一些方法。我已经研究了TTL索引,但似乎它们不允许任何类型的回调,并且从我读到的删除文档的过程每分钟只运行一次,这对我所需要的不够具体。以下是我提出的建议:

Meteor.setTimeout()

我担心的是我不确定importHref(href, onload, onerror).如何使用线程,所以如果我有数百或数千个这些调用,我想知道它是否会导致问题。任何人都可以推荐一种更好的方法来实现这一目标吗?

提前致谢。

编辑:使用Meteor或cron运行后台作业不是我唯一关注的问题。我意识到我可以用cron工作完成同样的事情,但我宁愿每秒查询一次我的数据库只能找到3个到期项目而不是每30秒查询一次数据库,并找出哪些元素将在下一期。

1 个答案:

答案 0 :(得分:3)

似乎更简单的解决方案是将删除日期存储在每个文档中,而不是TTL中。想象一下,您有一个名为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

注意:

  1. 请务必为remove编制索引,以便15/11/11 11:25:18 INFO mapred.LocalJobRunner: map task executor complete. 15/11/11 11:25:18 WARN mapred.LocalJobRunner: job_local194018022_0001 java.lang.Exception: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class device not found at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462) at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522) Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class device not found at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195) at org.apache.sqoop.mapreduce.db.DBConfiguration.getInputClass(DBConfiguration.java:403) at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.createDBRecordReader(DataDrivenDBInputFormat.java:237) 无需扫描整个馆藏。
  2. 从技术上讲,如果它在多个服务器实例上运行,这将不会破坏,但理想情况下它只能在一个服务器实例上运行。也许它可以在它自己的过程中运行。