Несколько групп в агрегированном конвейере mongodb

У меня есть коллекция, которая содержит данные, такие как:

{
  attribute: 'value',
  date: ISODate("2016-09-20T18:51:05Z")
}

и я хочу сгруппировать attribute чтобы получить общее количество по атрибуту и ​​в то же время сгруппировать по attribute а также $hour чтобы получить счет за атрибут и час.

Я знаю, что могу сделать что-то вроде:

{
  $group: {
    _id: '$attribute'
    count: {
      $sum: 1
    }
  }
}

а также

{
  $group: {
    _id: {
      attribute : '$attribute',
      hour: {
        '$hour' : '$date'
      }
    },
    count: {
      $sum: 1
    }
  }
},
{
  $group: {
    _id: {
      attribute: '$_id.attribute'
    },
    hours: {
      '$push': {
        hour: '$_id.hour',
        count: '$count'
      }
    }
  }
}

чтобы получить оба результата в двух отдельных агрегатах, но есть ли способ получить желаемый результат в одном запросе?

Редактировать по запросу:

Возможно, это совершенно неправильно, но в идеале я хотел бы получить ответ:

{
  _id: "attribute1",
  total: 20, // Total number of attribute1 documents

  // And the breakdown of those 20 documents per hour
  hours: [{
    hour: 10,
    count: 8
  },
  {
    hour: 14,
    count: 12
  }]
}

Однако весь вопрос заключается в том, можно ли это сделать (и каким образом) по одному запросу в mongodb. Не в двух запросах, которые будут объединены на прикладном уровне

1 ответ

Решение

Вы можете сначала сгруппировать пары атрибут-час и их соответствующие вхождения.
Затем вы проецируете атрибут, пару часов и копию этого счета.
Наконец, вы группируете по одному атрибуту, $push пары, и суммировать счет.

[
    {
        $group: {
            _id: {
                attribute: "$attribute",
                hour: { "$hour": "$date" }
            },
            count: {
                $sum: 1
            }
        }
    },
    {
        $project: {
            attribute: "$_id.attribute",
            pair: { hour: "$_id.hour", count: "$count" },
            count: "$count",
            _id: 0
        }
    },
    {
        $group: {
            _id: "$attribute",
            hours: {
                $push: "$pair"
            },
            total: {
                $sum: "$count"
            }
        }
    }
]
Другие вопросы по тегам