mongodb - 如何获取 Mongo 中特定日期每小时的平均值?

标签 mongodb aggregation-framework

我在 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" }
    }
  }
])

Playground

结果将是,

[
    { "_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/

相关文章:

mongodb - 将$ graphLookup的ObjectId与String匹配

mongodb - 根据字段值指定的嵌入对象的字段值对 MongoDB 集合进行排序?

Spring 数据 MongoDB : How to describe aggregation $merge with Spring Aggregation?

arrays - 如何使用 MongoDB 上的聚合从数组中删除字段?

mongodb - 将两个字段合并到一个数组中

mongodb - 根据 ObjectId 聚合和减少嵌套数组

c++ - 如何使用 C++ 在 MongoDB 中编写简单的查询?

MongoDB 3.0.5 错误 : symbol lookup error: undefined symbol: FIPS_mode_set

MongoDB - 自动维护数据完整性

MongoDB,将内部哈希键值按另一个键值分组