查询使用Mongodb获取最后X分钟数据

Gok*_*oku 21 mongodb

我开始使用mongodb,我正在尝试查询具有此文档格式的数据库:

{ "_id" : ObjectId("520b8b3f8bd94741bf006033"), "value" : 0.664, "timestamp" : ISODate("2013-08-14T13:48:35Z"), "cr" : ISODate("2013-08-14T13:50:55.834Z") }
Run Code Online (Sandbox Code Playgroud)

我可以使用此查询从日期时间获取最后的记录:

> db.mycol.find({timestamp:{$gt: ISODate("2013-08-14T13:48:00Z")}}).sort({x:1});
Run Code Online (Sandbox Code Playgroud)

但是我试图从18分钟前获得一个带有值字段和时间戳的集合,我该如何为此构建查询?谢谢大家耐心等待...

H.D*_*.D. 51

对于18分钟的部分,这不是关于MongoDB,而是关于JavaScript和mongo shell中可用的内容:

query = {
    timestamp: { // 18 minutes ago (from now)
        $gt: new Date(ISODate().getTime() - 1000 * 60 * 18)
    }
}
Run Code Online (Sandbox Code Playgroud)

在mongo shell中工作,但使用Mongo驱动程序用于其他语言会有所不同.

使用值和时间戳来"投影"在较小的模式上:

projection = {
    _id: 0,
    value: 1,
    timestamp: 1,
}
Run Code Online (Sandbox Code Playgroud)

同时应用:

db.mycol.find(query, projection).sort({timestamp: 1});
Run Code Online (Sandbox Code Playgroud)

那么,这仍然不是一个"集",因为可能有重复.要摆脱它们,您可以使用$group聚合框架:

db.mycol.aggregate([
    {$match: query},
    {$group: {
        _id: {
            value: "$value",
            timestamp: "$timestamp",
        }
    }},
    {$project: {
        value: "$_id.value",
        timestamp: "$_id.timestamp",
    }},
    {$sort: {timestamp: 1}},
])
Run Code Online (Sandbox Code Playgroud)


小智 6

你也可以在下面做

  db.getCollection('collectionName').find({timestamp : {$gte: new Date().getTime()-(60*60*1000) } } )
Run Code Online (Sandbox Code Playgroud)

上面的查询将为您提供时间戳 b/w 现在和 60 分钟的记录。如果您喜欢超过 60 分钟 - 比如说 2 小时,您可以将表达式更改为 (2*60*60*1000) 30 分钟 (30*60*1000)


Xav*_*hot 5

从 开始Mongo 5,您可以使用$dateSubtract

// { date: ISODate("2021-12-05T20:32:56Z") } <= 5  minutes ago
// { date: ISODate("2021-12-05T20:07:56Z") } <= 25 minutes ago (older than 18 minutes)
db.collection.aggregate([
  { $match: {
    $expr: {
      $gt: [
        "$date",
        { $dateSubtract: { startDate: "$$NOW", unit: "minute", amount: 18 } }
      ]
    }
  }}
])
// { date: ISODate("2021-12-05T20:32:56Z") } <= 5 minutes ago
Run Code Online (Sandbox Code Playgroud)

使用,我们可以通过从当前日期( ) 中减去( ) ( )$dateSubtract来创建最旧的日期/时间,然后保留文档。18amount"minute"unit$$NOWstartDate