Javascript MongoDB查询超过30秒的文档

Javascript MongoDB查询超过30秒的文档,javascript,mongodb,mongodb-query,mongojs,Javascript,Mongodb,Mongodb Query,Mongojs,是否有人有一个很好的方法来查询超过30秒的文档集合。我正在创建一个清理工作程序,在项目处于特定状态超过30秒后将其标记为失败 这不重要,但我用这个 每个文档都有一个与之相关联的创建时间。您可以使用以下内容: var d = new Date(); d.setSeconds(d.getSeconds() - 30); db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {} ); 我们假设您的文

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

这不重要,但我用这个


每个文档都有一个与之相关联的
创建时间。

您可以使用以下内容:

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

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

我们假设您的文档中有一个在
处创建的
或类似字段,该字段具有插入或修改的时间,具体取决于对您来说重要的时间

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

在shell语法中,应该与驱动程序的语法基本相同:

db.collection.update({
     created_at: {$lt: time },
     state: oldstate 
},
{$set: { state: newstate } }, false, true )
第一个
false
用于在这种用法中没有任何意义的升级,第二个
true
标记用于
多个
文档更新


如果文件确实是短暂的,以后你就没有其他需要了,那么你可以考虑一下。您可以使用
总大小
生存时间
选项,自然插入顺序有利于处理排队条目。

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

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

…将查找超过72小时的文档(“现在”减去“72*60*60*1000”毫秒)。30秒等于1000*30。

TTL选项也是一个优雅的解决方案。它是一个索引,可在x秒后自动删除文档,请参见此处:

示例代码为:


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

我不确定如何以正确的格式获取日期对象以用于查询。这很有效。谢谢对于那些将使用TTL索引的用户,请注意:
TTL索引不能保证过期数据在过期后立即被删除。文档过期与MongoDB从数据库中删除文档之间可能存在延迟。