2014-02-05 22 views
3

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

这并不重要,但我使用mongojs这个。

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

回答

6

我们假设您的文档有它插入或取决于否则修改是对你很重要的时间中有created_at或类似的领域。

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

在shell语法,这应该是几乎相同的驱动程序时:

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

第一false是为upserts不作任何意义在此用法中,第二个true标记为multi文档更新。

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

3

你可以使用类似的东西:

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

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

我不知道如何与使用正确的格式得到一个日期对象查询。这很好。谢谢! –

7

如果你想做到这一点使用蒙戈外壳:

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

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