【发布时间】:2018-06-05 18:05:44
【问题描述】:
我想知道是否可以对不同文档值的总和进行 $avg。我的文档结构如下:
time: { type: Number, required: true },
date: { type: Date, required: true },
reg: {
hi: { type: Number, default: 0 },
mid: { type: Number, default: 0 },
low: { type: Number, default: 0 },
null: { type: Number, default: 0 }
},
area: { type: mongoose.Schema.Types.ObjectId, ref: 'Area', required: true }
这是集合中的三个示例文档:
{
"_id" : ObjectId("5a2c64237a651d3cc2dc2da1"),
"time" : 1510193369104,
"date" : ISODate("2017-11-09T02:09:29.104Z"),
"area" : ObjectId("5a236b2309391a0febfac0c9"),
"reg" : {
"hi" : 59,
"mid" : 35,
"low" : 1573,
"null" : 4733
}
}
{
"_id" : ObjectId("5a2c64237a651d3cc2dc2da5"),
"time" : 1510193369104,
"date" : ISODate("2017-11-09T02:09:29.104Z"),
"area" : ObjectId("5a236b2309391a0febfac0a9"),
"reg" : {
"hi" : 0,
"mid" : 0,
"low" : 2018,
"null" : 4382
}
}
{
"_id" : ObjectId("5a2c64247a651d3cc2dc2df4"),
"time" : 1510193369104,
"date" : ISODate("2017-11-09T02:09:29.104Z"),
"area" : ObjectId("5a236b2309391a0febfac11b"),
"reg" : {
"hi" : 57,
"mid" : 235,
"low" : 1909,
"null" : 4199
}
}
对于每个文档,我需要乘以:“reg.hi”乘以 3,“reg.mid”乘以 2,“reg.low”乘以 1。然后,将三个结果相加得到平均值。
我不知道这是否可以在聚合查询中完成,我尝试了很多方法都没有成功。
这是一个,至少,作为结果抛出了一个有效的数字(注意我正在使用 $match 过滤文档,但这不应该打扰)。
Log.aggregate([{
$group: {
_id: { area: "$area" },
avg: {
$avg: {
$sum: {
$multiply: ["$reg.low", 1],
$multiply: ["$reg.mid", 2],
$multiply: ["$reg.hi", 3]
}
}
}
}
}
])
提前致谢!
【问题讨论】:
-
嗨!欣赏架构,但给我们 3 或 4 个实际输入文档。看起来您要进行加权平均,并且您已经步入正轨(减去除以 5),但请告诉我们您要寻找什么输出,我相信会有一个可以满足的查询。
-
@BuzzMoschetti 很酷,感谢您的建议。我已经添加了三个示例文档!谢谢
标签: node.js mongodb mongoose aggregation-framework aggregate