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

时间:2013-08-14 14:04:18

标签: mongodb

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

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

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

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

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

4 个答案:

答案 0 :(得分:47)

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

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

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

使用值和时间戳对较小的模式进行“投影”:

projection = {
    _id: 0,
    value: 1,
    timestamp: 1,
}

同时应用:

db.mycol.find(query, projection).sort({timestamp: 1});

嗯,这仍然不是一个“集”,因为可能有重复。要摆脱它们,您可以使用聚合框架中的$group

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

答案 1 :(得分:4)

您也可以在下面进行

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

上面的查询ll给您现在和60分钟的黑白时间戳记录。如果您喜欢60分钟以上-例如2小时,则可以将表达式更改为(2 * 60 * 60 * 1000) 30分钟(30 * 60 * 1000)

答案 2 :(得分:2)

哇,感谢@Alistair_Nelson我能够从n分钟前获得数据,例如从ISODate获取最后18分钟(“2013-08-14T14:00:00Z”):

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}})

仅获取我需要的字段:

db.mycol.find({timestamp:{$gt: new Date(ISODate("2013-08-14T14:00:00Z")-18*60000)}},{value:1,timestamp:1, _id:0})

答案 3 :(得分:0)

您可以使用nodejs从mongodb访问当前时间戳的数据

 const collection1 = dbo.collection('customers');
    var dateq = new Date();
      collection1.find({    "Timestamp" : { $gt: new Date(dateq.getTime() - 6000)}  
    }).toArray(function(err , docs){   
    console.log(docs);
    }

代码结尾