5

有没有人有一个很好的方法来查询超过 30 秒的文档集合。我正在创建一个清理工作人员,在项目处于特定状态超过 30 秒后将其标记为失败。

这并不重要,但我正在为此使用mongojs

每个文档都有一个created与之关联的时间。

4

4 回答 4

17

If you want to do this using mongo shell:

db.requests.find({created: {$lt: new Date((new Date())-1000*60*60*72)}}).count()

...will find the documents that are older than 72 hours ("now" minus "72*60*60*1000" msecs). 30 seconds would be 1000*30.

于 2014-03-19T19:00:41.710 回答
7

我们假设您created_at的文档中有一个或类似的字段,该字段具有插入或以其他方式修改的时间,具体取决于哪个对您很重要。

而不是迭代结果,您可能希望查看更新multi中的选项以将您的更改应用于与您的查询匹配的所有文档。设置你想过去的时间应该相当简单

在 shell 语法中,应该与驱动程序几乎相同:

db.collection.update({
     created_at: {$lt: time },
     state: oldstate 
},
{$set: { state: newstate } }, false, true )

第一个false用于更新插入,在此用法中没有任何意义,第二个true标记用于multi文档更新。

如果这些文档确实是短暂的,并且之后您不再需要它们,那么您可以考虑使用capped collections。您可以对这些有一个total sizeortime to live选项,并且自然插入顺序有利于处理排队的条目。

于 2014-02-06T00:26:56.813 回答
4

你可以使用类似的东西:

var d = new Date();
d.setSeconds(d.getSeconds() - 30);

db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {} );
于 2014-02-06T00:02:01.150 回答
2

TTL 选项也是一个优雅的解决方案。这是一个在 x 秒后自动删除文档的索引,请参见此处:https ://docs.mongodb.org/manual/core/index-ttl/

示例代码是:

db.yourCollection.createIndex({ created:1 }, { expireAfterSeconds: 30 } )

于 2016-04-27T15:58:20.617 回答