36

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

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

4

10 回答 10

45

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

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

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

于 2015-10-27T05:25:14.430 回答
20

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

var ObjectID = require('mongodb').ObjectID

db.collection.find({
  _id: {
    $gt: ObjectID.createFromTime(Date.now() / 1000 - 24*60*60)
  }
}, callback)
于 2012-11-10T00:45:21.213 回答
14

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

db.collection.find({ $where: function () { return Date.now() - this._id.getTimestamp() < (24 * 60 * 60 * 1000)  }  })
于 2013-12-13T17:12:37.057 回答
6

在猫鼬中使用它

let ObjectId    = require('mongodb').ObjectID;

Property.find({
    _id: {
        $gt: ObjectId.createFromTime(Date.now() / 1000 - 24 * 60 * 60)
    }
}, (err, result) => {
    console.log(err || result);
});
于 2017-01-13T13:02:05.563 回答
3

首先,如果您向人们提供您的收藏模式,那将真的很有帮助。

但仅仅因为它已经过去了 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
   }
});
于 2012-11-09T23:36:34.313 回答
2

希望这可以帮助某人。我正在使用 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)
     }
}
于 2019-12-17T17:20:43.580 回答
1

从 开始,这是新聚合运算符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

需要注意的几点:

  • 基本上,我们正在创建项目,它们的创建日期(由它们表示)和现在( )之间$match的持续时间( )小于()。$dateDiff_id$$NOW$lt24 hours

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

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

于 2021-06-15T19:58:43.397 回答
0

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

db.your_collection_name.find({"TIME":{'$lt': new Date(),'$gte':new Date(new Date().setDate(new Date().getDate()-1))}},{}).count();
于 2016-09-02T06:21:10.313 回答
-1

我遇到了同样的问题,经过大量搜索,我发现从过去 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>

于 2021-05-24T10:33:59.227 回答
-1
db.video.find({"timestamp":{$lt: new Date(),$gte: new Date(new Date().setDate(new Date().getDate()-1))}})
于 2021-07-20T11:56:20.167 回答