我的 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/