2016-09-20 4 views
0

У меня есть коллекция, которая содержит данные, такие как:Несколько групп в 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. Не в двух запросах, которые будут объединены на прикладном уровне

+0

Вопрос не ясен. Можете ли вы представить конкретный пример вывода, о котором вы думаете? –

+0

@LeifEricson Я добавил пример ответа, надеюсь, теперь это ясно. Английский не мой родной язык, так что здесь может быть и языковой пробел, извините :) – mobius

ответ

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" 
      } 
     } 
    } 
] 
+0

Вы правы! Спасибо! – mobius

Смежные вопросы