【问题标题】:Fetch documents from a MongoDB collection based on timestamp根据时间戳从 MongoDB 集合中获取文档
【发布时间】:2018-03-19 09:32:15
【问题描述】:

我有一个 MongoDB 集合,其中包含如下所示的文档

{
    "_id" : ObjectId("5aab91b2caa256021558f3d2"),
    "Timestamp" : "2017-11-16T14:43:07.5357785+01:00",
    "status" : 1,
    "created_at" : 1521193394,
    "updated_at" : 1521193394,
    "deleted_at" : ""
}

数据每 15 分钟输入一次集合。使用处于纪元时间的 created_at 字段,我想找到一种在每小时开始时获取数据的方法。例如,在12.00 12.15 12.30 12.45 13.00 13.15 13.30 13.45 14.00 输入数据。

我想从集合中提取在 12.00、13.00 和 14.00 输入的条目。

我也愿意接受关于使用纪元时间是否是最好的方法的建议。

【问题讨论】:

    标签: mongodb epoch


    【解决方案1】:

    使用纪元时间确实是一个好方法。

    由于您是以秒为单位的,因此每一小时都可以被 3600(以小时为单位的秒数)整除而没有余数。您可以使用此属性来查找您的文件。

    db.collection.find({created_at: {$mod: [ 3600, 0 ]}});
    

    根据$mod 文档,它会,

    选择字段值除以除数的文档 指定余数

    我们提供的除数为3600,余数为0。这应该可以满足您的期望。

    忽略秒数:

    对于这个条件,mod(epoch, 3600) 应该小于 59。这个查询可以使用 mongo 3.6 的$expr 形成

    db.collection.find({$expr: {$lte: [{ $mod: [ '$created_at', 3600 ] }, 59]}});
    

    希望这会有所帮助!

    【讨论】:

    • 非常感谢@RaR,它帮了很多忙,但我的网站有点过头了。例如,即使条目是在 12.00 进入的,它可能并不完全是 12.00.00,并且由于我们使用的是纪元时间,因此 12.00.00 将不同于 12.00.05,因此这样做不会获取任何记录。您对如何查询 12.00.* 之类的内容有任何想法吗?
    • @user3010617 这可以通过 mongo 3.6 中提供的 $expr 来完成。你用的是哪个版本的mongodb?
    • 非常感谢@RaR,当我对集合运行它时,这似乎工作得很好,我使用的是 3.6.2 版。只需要弄清楚如何将其翻译成jenssegers/laravel-mongodb可以理解的东西
    • @user3010617, 刚刚注意到,条件应该是$lte$lt 值60,因为直到第59 秒,我们可以认为是圆形小时。将答案更新为$lte
    猜你喜欢
    • 2021-06-05
    • 2022-12-09
    • 2023-01-31
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多