MongoDB:计算文档的平均值&然后在整个系列中做同样的事情

时间:2014-11-23 19:51:44

标签: mongodb mapreduce aggregation-framework

我收集了带有子文档(薪水)的文档(优惠),如下所示:

{
    _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"}}}
])

1 个答案:

答案 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"}}}
])