使用Mongodb查询以获取最近X分钟的数据

s2j5cfk0  于 2023-03-01  发布在  Go
关注(0)|答案(6)|浏览(219)

我正在尝试查询具有此文档格式的数据库:

{
  "_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分钟前的值字段和时间戳做一个集合。

at0kjp5o

at0kjp5o1#

在这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}},
])
eqzww0vc

eqzww0vc2#

您还可以执行以下操作

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

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

uqdfh47h

uqdfh47h3#

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

对于$dateSubtract,我们创建了最早的日期/时间,在此日期/时间之后我们保留文档,方法是从当前日期$$NOWstartDate)中减去18amount"minute"unit)。

4nkexdtk

4nkexdtk4#

您可以使用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);
    }

码尾

k97glaaz

k97glaaz5#

哇,多亏了@Alistair_纳尔逊,我才能获得n分钟前的数据,例如,从ISODate(“2013-08- 14 T14:00:00 Z”)获得最后18分钟的数据:

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})
bweufnob

bweufnob6#

const xMins = 10;

db.mycol.find({ timestamp: { $gt: new Date(Date.now() - 1000 * 60 * xMins) } }).sort({ x: 1 });

相关问题