【问题标题】:MongoDB: Only fetch documents created in the last 24hrs?MongoDB:仅获取过去 24 小时内创建的文档?
【发布时间】:2012-10-30 03:54:26
【问题描述】:

我想限制我所做的查询仅查看过去 24 小时内创建的文档。

构建此查询的最佳方式是什么?如何根据日期进行限制?

【问题讨论】:

标签: mongodb


【解决方案1】:

添加createdAt字段,索引,然后查询

db.getCollection("COLLECTION_NAME").find({"createdAt":{$gt:new Date(Date.now() - 24*60*60 * 1000)}})

这将返回所有早于 86400 秒的记录。

【讨论】:

    【解决方案2】:

    如果您没有使用任何其他索引并且使用默认的 ObjectID 作为您的 _id,您可以执行以下操作:

    var ObjectID = require('mongodb').ObjectID
    
    db.collection.find({
      _id: {
        $gt: ObjectID.createFromTime(Date.now() / 1000 - 24*60*60)
      }
    }, callback)
    

    【讨论】:

    • JavaScript 执行失败:ReferenceError: ObjectID is not defined
    • TypeError: Object function ObjectId() { [native code] } has no method 'createFromTimestamp'
    • 我的错,createFromTime。他们可能已经改变了它:mongodb.github.io/node-mongodb-native/api-bson-generated/…
    • 得到同样的错误:ReferenceError: ObjectID is not defined
    • 关闭,但我认为应该是ObjectID.createFromTime(Date.now() \ 1000 - 24 * 60 * 60)。
    【解决方案3】:

    对于通过 google 登陆的其他人,您可以在 mongo shell 中执行此操作,如下所示:

    db.collection.find({ $where: function () { return Date.now() - this._id.getTimestamp() < (24 * 60 * 60 * 1000)  }  })
    

    【讨论】:

    【解决方案4】:

    在猫鼬中使用这个

    let ObjectId    = require('mongodb').ObjectID;
    
    Property.find({
        _id: {
            $gt: ObjectId.createFromTime(Date.now() / 1000 - 24 * 60 * 60)
        }
    }, (err, result) => {
        console.log(err || result);
    });
    

    【讨论】:

      【解决方案5】:

      首先,如果您向人们提供您收藏的架构,那将非常有帮助。

      但是因为已经过去了 3 个小时,没有人回复,所以我会尝试:

      假设你有一个条目,它有一个字段 createdAt 是一个 ISODate:

      {
      somefield: "test",
      createdAt: ISODate("2012-08-13T04:00:00Z")
      }
      

      所以你需要做的就是在这个字段上放一个索引

      db.yourColl.ensureIndex({createdAt:1});
      

      然后你在 node.js 中得到你当前的时间来代替你的 24 小时并得到你的 start 值。 (据我所知,在 mongdb 中没有 NOW 的类似物。如果我错了,请纠正我。)

      db.yourColl.find({
         createdAt: {
           $gte: start
         }
      });
      

      【讨论】:

        【解决方案6】:

        希望这对某人有所帮助。我正在使用 pymongo 查询最近 24 小时的数据。就我而言,我必须将当前时间转换为 BSON 时间戳。

        首先我必须导入 Bson 时间戳:

        from bson.timestamp import Timestamp
        

        然后在我的搜索查询中,我执行了以下操作:

        yesterday  = datetime.datetime.now() - datetime.timedelta(days=1)
        
        findQuery = {
            "unix": {
                "$gte": Timestamp(int(yesterday.strftime("%s")),0)
             }
        }
        

        【讨论】:

          【解决方案7】:

          从Mongo 5.0 开始,这是新的$dateDiff 聚合运算符的一个很好的用例:

          // { "_id" : ObjectId("60c8f804fb832fe2f2011657") }
          db.collection.aggregate([
            { $match: { $expr:
              { $lt: [{ $dateDiff: { startDate: "$_id", endDate: "$$NOW", unit: "hour" } }, 24 ]}
            }}
          ])
          // { "_id" : ObjectId("60c8f804fb832fe2f2011657") } // if document created within the last 24 hours
          

          需要注意的几点:

          • 基本上,我们$matching 项目的创建日期(由它们的 _id 表示)和现在 ($$NOW) 之间的持续时间 ($dateDiff) 小于 ($lt) @ 987654332@hours.

          • 开始日期是$_id (ObjectId):

            • 确实,ObjectId 包含其创建的时间戳
            • $dateDiff 可以接受 ObjectId 作为时间表示
          • 结束日期为$$NOW,这是一个返回当前日期时间值的变量。

          【讨论】:

            【解决方案8】:

            “TIME”是存储时间戳的字段

            db.your_collection_name.find({"TIME":{'$lt': new Date(),'$gte':new Date(new Date().setDate(new Date().getDate()-1))}},{}).count();
            

            【讨论】:

              【解决方案9】:

              我遇到了同样的问题,经过大量搜索后,我发现从过去 X 天获取数据的最佳解决方案是这样的:

              let date_obj = new Date();
              let requestedTime = new Date(new Date().setDate(date_obj.getDate() - day));
                  
                  db.collection.find({
                    createdAt: {$gt: requestedTime}
                  });
              

              day 变量必须是你想要的天数的数值,例如:1 表示一天前(过去 24 小时),2 表示两天前(过去 48 小时),30 表示上个月,最近两个月60,以此类推。 ..

              let date_obj = new Date();
              let requestedTime = new Date(new Date().setDate(date_obj.getDate() - 1));
              
              document.querySelector("#current_date").innerHTML = `current date: ${date_obj}`
              document.querySelector("#last_24H_date").innerHTML = `last 24 hours: ${requestedTime}`
              <div id="current_date"></div>
              <div id="last_24H_date"></div>

              【讨论】:

                【解决方案10】:
                db.video.find({"timestamp":{$lt: new Date(),$gte: new Date(new Date().setDate(new Date().getDate()-1))}})
                

                【讨论】:

                • 纯代码答案并不是特别有用。请添加一些关于此代码如何解决问题的描述。
                • 为了扩展@shree 的观点,这里尤其是 正确,这里有 9 个 其他答案,其中一些获得了相当多的支持,而大多数有解释。如果新读者来到此页面并试图找到解决方案,那么您的方法与现有答案有何不同?在什么情况下你的答案可能会被首选?您是否使用了首次提出问题时不可用的新语法?这类信息将使您的回答成为对该主题的有用贡献。
                猜你喜欢
                • 2019-11-04
                • 2018-06-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-05
                • 1970-01-01
                • 2020-01-14
                • 2018-09-12
                相关资源
                最近更新 更多