我想知道我是否可以执行$ 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]
}
}
}
}
}
])
提前致谢!
答案 0 :(得分:1)
好吧,如果您想要对每个文档进行乘法和平均,那么只需使用$addFields
:
db.foo.aggregate([
{$addFields: { theAverage: {$avg: [
{$multiply: ["$reg.low", 1]}
,{$multiply: ["$reg.mid", 2]}
,{$multiply: ["$reg.hi", 3]}
]}
}}
]);
答案 1 :(得分:1)
您的运营商配对不正确。使用带有操作数表达式列表的$sum
变量。每个操作数都是一个文档。
试试这个
Log.aggregate([{"$group":{
"_id":{"area":"$area"},
"avg":{
"$avg":{
"$sum":[
{"$multiply":["$reg.low",1]},
{"$multiply":["$reg.mid",2]},
{"$multiply":["$reg.hi",3]}
]
}
}
}}])