首页 > 解决方案 > 移动平均聚合MongoDB

问题描述

我正在寻找一种简单的方法来计算给定日期的 90 天移动平均线。我有一个名为 Response 的文档,它具有给定的结构:

{
 _id: ObjectId("60e4cf6e783e125bd80f1cf5"),
 createdAt: 2021-07-06T21:47:26.282+00:00,
 value: 8
}

我知道如何计算给定日期的 90 天移动平均线,例如 2021-08-10,但我想要实现的是这种类型的数组:

[ 
  {date: 2021-08-10, average: 6.7}, 
  {date: 2021-08-09, average: 6.8},
  {date: 2021-08-08, average: 6.5},
  ...
]

我试图计算循环内一组日期的移动平均值,但考虑到我需要为多达 365 个不同的日期计算它,性能绝对是糟糕的。

关于如何解决这个问题的任何想法?非常感谢一些帮助。

标签: node.jsmongodbmongoosemoving-average

解决方案


如果您还没有运行 Monog 5.0,那么这将是一个起点:

db.collection.aggregate([
   { $group: { _id: null, data: { $push: "$$ROOT" } } },
   {
      $set: {
         data: {
            $map: {
               input: { $range: [0, { $size: "$data" }] },
               as: "idx",
               in: {
                  createdAt: { $arrayElemAt: ["$data.createdAt", "$$idx"] },
                  window: {
                     $filter: {
                        input: "$data",
                        cond: {
                           $and: [
                              { $gte: ["$$this.createdAt", { $arrayElemAt: ["$data.createdAt", "$$idx"] }] },
                              { $lt: ["$$this.createdAt", { $add: [{ $arrayElemAt: ["$data.createdAt", "$$idx"] }, 1000 * 60 * 60 * 24 * 90] }] }
                           ]
                        }
                     }
                  },
               }
            }
         }
      }
   },
   {
      $set: {
         data: {
            $map: {
               input: "$data",
               in: {
                  createdAt: "$$this.createdAt",
                  window:  "$$this.window.value",
                  average: {$avg: "$$this.window.value"}
               }
            }
         }
      }
   }
])

推荐阅读