我收集了带有子文档(薪水)的文档(优惠),如下所示:
{
_id: ObjectId("zzz"),
sphere: ObjectId("xxx"),
region: ObjectId("yyy"),
salary: {
start: 10000,
end: 50000
}
}
我想计算一些地区的平均工资&整个系列的球体。我为此创建了查询,它可以工作,但它只关注工资起始值。
db.offer.aggregate(
[
{$match:
{$and: [
{"salary.start": {$gt: 0}},
{region: ObjectId("xxx")},
{sphere: ObjectId("yyy")}
]}
},
{$group: {_id: null, avg: {$avg: "$salary.start"}}}
]
)
但首先我要计算报价的平均工资(开始和结束)。我怎么能这样做?
更新
如果您的数据中可能缺少“salary.end”的值,则需要添加一个额外的“$ project”迭代,以使用现有的“salary.start”替换缺少的“salary.end”。否则,由于忽略缺少“salary.end”值的文档,平均函数的结果将被计算错误。
db.offer.aggregate([
{$match:
{$and: [
{"salary.start": {$gt: 0}},
{"region": ObjectId("xxx")},
{"sphere": ObjectId("yyy")}
]}
},
{$project:{"_id":1,
"sphere":1,
"region":1,
"salary.start":1,
"salary.end":1,
"salary.end": {$ifNull: ["$salary.end", "$salary.start"]}
}
},
{$project:{"_id":1,
"sphere":1,
"region":1,
"avg_salary":{$divide:[
{$add:["$salary.start","$salary.end"]}
,2
]}}},
{$group:{"_id":{"sphere":"$sphere","region":"$region"},
"avg":{$avg:"$avg_salary"}}}
])
答案 0 :(得分:0)
您必须修改聚合方式:
Match
所需的地区,领域和工资> 0 Project
每个要约的额外字段,其中包含平均值
开始和结束。group
将具有相同区域和范围的记录放在一起,并且
对每个要约在$avg
上应用avg_salary
聚合运算符
在那个小组中,要获得平均工资。守则:
db.offer.aggregate([
{$match:
{$and: [
{"salary.start": {$gt: 0}},
{"region": ObjectId("xxx")},
{"sphere": ObjectId("yyy")}
]}
},
{$project:{"_id":1,
"sphere":1,
"region":1,
"avg_salary":{$divide:[
{$add:["$salary.start","$salary.end"]}
,2
]}}},
{$group:{"_id":{"sphere":"$sphere","region":"$region"},
"avg":{$avg:"$avg_salary"}}}
])