我在 MongoDB 中有一个集合,我想获取给定日期 24 小时时间间隔内值
的平均值。
这是我的收藏:
[
{
"_id": 1,
"value": 50,
"created_at": 1614217700
},
{
"_id": 2,
"value": 60,
"created_at": 1614219300
},
{
"_id": 3,
"value": 100,
"created_at": 1614226200
},
{
"_id": 4,
"value": 80,
"created_at": 1614227400
}
]
文档 3 和 4 处于同一时间段,因此 80 和 100 的平均值为 90。 这是我期望的结果(或类似结果)的示例。
[
{
"time": 0,
"avg_value": null
},
{
"time": 1,
"avg_value": 50
},
{
"time": 2,
"avg_value": 60
},
{
"time": 3,
"avg_value": null
},
{
"time": 4,
"avg_value": 90
},
,
,
,
{
"time": 23,
"avg_value": null
}
]
在这里您可以找到我的示例:https://mongoplayground.net/p/YaAeebapbD-
任何想法都将不胜感激。 谢谢!
最佳答案
数据库中的可用时间是可能的,对于空值,您需要准备静态数组并与结果合并,
$multiply
created_at
与 1000 将其转换为毫秒$toDate
将毫秒转换为 ISO 日期$hour
从 ISO 日期获取小时$group
按小时计算,高于使用$avg
转换的平均值
let result = db.collection.aggregate([
{
"$match": {
"created_at": {
"$gte": 1614211200,
"$lt": 1614297599
}
}
},
{
$group: {
_id: { $hour: { $toDate: { $multiply: ["$created_at", 1000] } } },
avg_value: { $avg: "$value" }
}
}
])
结果将是,
[
{ "_id": 1, "avg_value": 50 },
{ "_id": 2, "avg_value": 60 },
{ "_id": 4, "avg_value": 90 }
]
合并空闲时间并在客户端产生结果,如果您使用的是 Javascript/NodeJs,您可以查看示例,
// RESULT FROM QUERY
let result = [
{ "_id": 1, "avg_value": 50 },
{ "_id": 2, "avg_value": 60 },
{ "_id": 4, "avg_value": 90 }
];
// GENERATE NULL HOURS FOR 23 HOURS IN ARRAY
let hours = [];
for (let i = 0; i<24; i++) hours.push({ _id: i, avg_value: null });
// MERGE WITH QUERY RESULT
let mergeArray = hours.map(h => {
let f = result.find(r => h._id === r._id);
return f ? f : h;
});
console.log(mergeArray);
关于mongodb - 如何获取 Mongo 中特定日期每小时的平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66365040/