Структура агрегации mongodb группируется по нескольким полям

Моя коллекция похожа

{queid:'1',date:'07023/2013',topic: 'topic1'}
{queid:'2',date:'07022/2013',topic: 'topic2'}
{queid:'3',date:'07022/2013',topic: 'topic1'}
{queid:'4',date:'07023/2013',topic: 'topic1'}

я хочу, чтобы мой вывод был похож на

{topic1:
    [ {date:'07/23/2013',count:2},
      {date:'07/22/2013',count:1}
    ]
}

возможно ли это сделать mongodb..

я пытался сделать это

que.aggregate([{$match:c},{$group:{_id:'$topic',count:{$push:'$date'}}}])

который дает вывод как

{
        "_id" : "topic",
        "count" : [
                "2013-06-04",
                "2013-06-06",
                "2013-06-17",
                "2013-06-20"
] }

Я не могу понять, как группировать массив и заполнять счетчики.


person user1645542    schedule 24.07.2013    source источник


Ответы (2)


Я не знаю, что означает {$match:c} в вашем коде. На самом деле, я новичок в mongodb, и этот код:

que.aggregate([
  {$group:{_id:{"topic":"$topic","date":"$date"}, sum:{$sum:1}}},
  {$group:{_id:"$_id.topic", "dates":{$push:{"date":"$_id.date", "count":"$sum"}} }}
])

производит:

{
  "result" : [
     {
      "_id" : "topic2",
      "dates" : [
        { "date" : "07022/2013", "count" : 1}
      ]
     },
     {
      "_id" : "topic1",
      "dates" : [
        { "date" : "07022/2013", "count" : 1},
        { "date" : "07023/2013", "count" : 2}
      ]
     }
  ],
  "ok" : 1
}

Я думаю, вы можете играть с ним, чтобы получить то, что вы хотите.

person Yevgeniy Anfilofyev    schedule 24.07.2013
comment
На самом деле, я думаю, что это примерно то, что вы можете получить. Преобразование произвольных значений (таких как тема1 или тема2) в ключи на самом деле невозможно. - person Derick; 24.07.2013

Map-Reduce может вам подойти.

eg:

map = function (){
  emit(this.topic+this.date, 1);
}

reduce = function (id, vals){
  return Array.sum(vals);
}

db.coll.mapReduce(map, reduce, {out:'results'});

http://docs.mongodb.org/manual/tutorial/map-reduce-examples/

person Ryan Wong    schedule 24.07.2013