mongodb - Mongodb 将值拆分为 5 分钟间隔并返回间隔组内的最新值

标签 mongodb mongodb-query aggregation-framework

我的 Mongo 数据库有这样的文档:

{
   "timestamp": ISODate("2015-09-27T15:28:06.0Z"),
    "value": '123'
},
{
   "timestamp": ISODate("2015-09-27T15:31:06.0Z"),
    "value": '737'
},
{
   "timestamp": ISODate("2015-09-27T15:35:00.0Z"),
    "value": '456'
},
{
   "timestamp": ISODate("2015-09-27T15:40:20.0Z"),
    "value": '789'
}

...等等...

我想要做的是以 5 分钟为间隔聚合这些值,然后获取每“5 分钟组”的最新值(带有最新时间戳)

所以基本上步骤是:

1)分成5分钟一组

2) 返回 5 分钟时间戳以及该 5 分钟组内具有最新时间戳的文档的值

根据这一点和我上面的文件,返回的文件应该是:

{
    "timestamp": ISODate("2015-09-27T15:25:00.0Z"),
    "value": '123'
},
{
    "timestamp": ISODate("2015-09-27T15:35:00.0Z"),
    "value": '456' // 456 has a newer timestamp than 737, which are in the same 5 minute range
},
{
    "timestamp": ISODate("2015-09-27T15:40:00.0Z"),
    "value": '789'
}

我尝试按照 5 分钟间隔进行分组,如下所述:https://stackoverflow.com/a/26814496/1007236

从那里开始,我不知道如何返回每 5 分钟组内的最新值。

我怎样才能做到这一点?

最佳答案

您可以通过非常简单的日期数学应用来解决这个问题:

db.collection.aggregate([
    { "$sort": { "timestamp": 1 } },
    { "$group": {
        "_id": {
            "$add": [
                { "$subtract": [
                    { "$subtract": [ "$timestamp", new Date(0) ] },
                    { "$mod": [
                        { "$subtract": [ "$timestamp", new Date(0) ] },
                        1000 * 60 * 5
                    ]}
                ]},
                new Date(0)
            ]
        },
        "value": { "$first": "$value" }
    }}
])

基本原理是以五分钟间隔计算时间的模 ( $mod ) 或“余数”,然后从基准时间中减去该值。这四舍五入为“五分钟”。

当然另一部分是你$sort以确保最小的原始“时间戳”排序“值”位于“顶部”。

其他部分是当你$subtract时“纪元”日期作为另一个日期的 BSON 日期,然后您会收到一个“整数”结果。类似的部分是向 BSON 日期类型添加 ( $add ) 一个“整数”以接收另一个 BSON 日期。

结果是 BSON Date 对象,四舍五入到您在数学中使用的间隔。

1000 millisecons X 60 seconds X 5 minutes.

关于mongodb - Mongodb 将值拆分为 5 分钟间隔并返回间隔组内的最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32844340/

相关文章:

mongodb - 使用 Jest 测试具有数据库调用的函数

node.js - 在mlab中上传图像

javascript - 使用聚合以及跳过和限制时获取文档总数

javascript - 使用 mongodb 聚合框架计算频率

performance - Mongo 性能

node.js - 使用 ISO 格式的日期作为字典中的键来解析/MongoDB

node.js - 如何根据常见的数组元素对文档进行匹配和排序

mongodb - 从 mongo db 中查找当前和以前的文档

java - MongoDB、Java - 从 JSON 查询到文档

$lookup 阶段内的 MongoDB 聚合 $elemMatch