node.js - 移动平均聚合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 个不同的日期计算它,性能绝对是糟糕的。
关于如何解决这个问题的任何想法?非常感谢一些帮助。
解决方案
如果您还没有运行 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"}
}
}
}
}
}
])
推荐阅读
- android - 如何设置 LiveData
- > 到 MutableLiveData
- >?
- python - 如何在 python 中实现正态性检查功能?
- linux - 如何使用 curl 和 printf 打印 ftp 文件信息
- c++ - _ZdlPvj 程序入口点在 DLL 中找不到
Exe.exe 。我该如何解决? - c# - 如何正确打开新表单并关闭现有表单而不会出现任何错误?
- python - 使用 python scrapy 没有得到结果
- javascript - 将另一个数组中的数组对象打印成javascript中的特定格式
- paypal - 用于试用期订阅的 PayPal IPN
- c# - 如何通过 Unity 访问服务器上的 PHP 文件以进行 MySQL 数据库操作?
- javascript - 如何使用猫鼬更新现有用户的密码?