Mongodb $ group и $ avg несколько полей - PullRequest
0 голосов
/ 16 октября 2018

Мне нужно получить среднее ежедневное, еженедельное и ежемесячное среднее количество записей в коллекции за определенный промежуток времени.Вот запрос, который я использую до сих пор.

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 голосов
/ 16 октября 2018

Используйте $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"}
  }
}
...