Mongodb $ group和$ avg几个字段

时间:2018-10-16 13:56:31

标签: mongodb mongodb-query aggregation-framework

我需要获取给定时间范围内集合中条目的每日,每周和每月平均值。 这是我到目前为止使用的查询。

db.collection.aggregate([
{
    $match: {
        "date":{
            $gte:ISODate('2017-01-01T00:00:00.000Z'),
            $lte:ISODate('2017-12-31T23:59:59.000Z')
          }
    }
},

{
    $project : { 
        "_id":0,
        "day": { $dayOfYear: "$date" }, //returns number between 1 and 366
        "week": { $week: "$date" }, //number between 0 and 53
        "month": { $month: "$date" } //number between 1 and 12
    }
},

{
    $group : {
        "_id":"$month", //change this to $day or $week when needed
        "total":{$sum : 1}
    }
},

{
    $group : {
        "_id":null,
        "total":{$avg : "$total"}
    }
}
])

然后我得到这样的东西:

{
    "_id" : null,
    "total" : 4793758.66666666667
}

它可以工作,但是我需要将第一个$ group _id更改为$ day或$ week才能获得结果。因此,为了生成单个报告,我实际上运行了三次查询。

是否可以在单个查询中获取每日,每周和每月的平均值?

1 个答案:

答案 0 :(得分:2)

使用$facet。在$facet之后添加下面的$match阶段,而不是其他阶段。

类似

{
  "$facet":{
    "day":[
      {"$group":{"_id":{"$dayOfYear":"$date"},"total":{"$sum":1}}}
    ],
    "week":[
      {"$group":{"_id":{"$week":"$date"},"total":{"$sum":1}}}
    ],
    "month":[
      {"$group":{"_id":{"$month":"$date"},"total":{"$sum":1}}}
    ]
  }
},
{
  "$project":{
     "totalDay":{"$avg":"$day.total"},
     "totalWeek":{"$avg":"$week.total"},
     "totalMonth":{"$avg":"$month.total"}
  }
}