【问题标题】:MongoDB query for document older than 30 secondsMongoDB 查询超过 30 秒的文档
【发布时间】:2014-03-02 16:52:25
【问题描述】:

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

这并不重要,但我使用mongojs 来处理这个问题。

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

【问题讨论】:

    标签: javascript mongodb mongodb-query mongojs


    【解决方案1】:

    你可以使用类似的东西:

    var d = new Date();
    d.setSeconds(d.getSeconds() - 30);
    
    db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {} );
    

    【讨论】:

    • 我不确定如何以正确的格式获取日期对象以用于查询。这很好用。谢谢!
    【解决方案2】:

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

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

    在shell语法中,应该和驱动差不多:

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

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

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

    【讨论】:

      【解决方案3】:

      如果你想使用 mongo shell:

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

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

      【讨论】:

        【解决方案4】:

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

        示例代码如下:

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

        【讨论】:

        • 使用TTL索引的朋友请注意:The TTL index does not guarantee that expired data will be deleted immediately upon expiration. There may be a delay between the time a document expires and the time that MongoDB removes the document from the database.
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        相关资源
        最近更新 更多