MongoDB查询超过30秒的文档

时间:2014-02-05 23:47:08

标签: javascript mongodb mongodb-query mongojs

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

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

每个文档都有created个时间。

4 个答案:

答案 0 :(得分:10)

如果你想使用mongo shell执行此操作:

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

...将找到超过72小时的文件(“现在”减去“72 * 60 * 60 * 1000”msecs)。 30秒将是1000 * 30.

答案 1 :(得分:6)

我们假设您的文档中有一个created_at或类似的字段,其中包含插入或修改的字段,具体取决于哪个对您很重要。

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

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

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

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

如果文件确实是短暂存在的,之后你没有其他需要,那么你可以考虑capped collections。您可以为这些选项设置total sizetime to live选项,自然插入顺序有利于处理排队的条目。

答案 2 :(得分:4)

你可以使用类似的东西:

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

db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {} );

答案 3 :(得分:2)

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

示例代码为:

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