2016-11-12 3 views
0

У меня есть коллекция MongoDB с большим количеством документов в формате последующей:Уплотненный агрегат трубопровода для MongoDB

{ 
    "_id": { 
     "$oid": "581f9eae05711c35f461d779" 
    }, 
    "eventID": "Illinois84bc00edc91c24a95573", 
    "type": "voteup", 
    "update": "f3a44be56669e01cf02ed685c97451ba", 
    "count": 1, 
} 

Мне нужно, чтобы иметь возможность запускать агрегат с моего сервера по сбору и возвращает объект JSON, который :

Группы данных eventID (есть много идентификаторов событий), а затем группирует документы в этих группах путем обновления (имеется много обновлений, каждый из которых связан с идентификатором события), а затем для каждой группы событий/группы обновлений суммирует ' count "каждого из документов, которые имеют тип« голосование »и« проголосовали ».

Так фактический выход может выглядеть следующим образом:

{ 
    "events": [ 
    // array of objects, one for each unique eventID 
     { 
      "eventID": "Idaho4532543trt3424f", 
      "updates": [ 
      // array of objects, one for each unique update 
       { 
        "update": "rh43782ty738tywuioty34", 
        "voteup": 12, // the number of documents with that eventID/update which are type "voteup" 
        "votedown": 1 // the number of documents with that eventID/update which are type "voteudown" 
       }, 
       { 
        "update": "hfu89h834hw8uoglthyw78", 
        "voteup": 2, 
        "votedown": 32 
       }, 
       { 
        "update": "as09g8fgdsiuhgofhdosug", 
        "voteup": 123, 
        "votedown": 5 
       } 
      ] 
     }, 
     // here's another event... 
     { 
      "eventID": "Texas38tr943uytwo9grs", 
      "updates": [ 
       { 
        "update": "2ty738tywuioty34rh4378", 
        "voteup": 0, 
        "votedown": 1 
       }, 
       { 
        "update": "34hw8uoglthyw78hfu89hv", 
        "voteup": 22, 
        "votedown": 72 
       }, 
       { 
        "update": "dsiuhgofhdosugas09g8fg", 
        "voteup": 67, 
        "votedown": 11 
       } 
      ] 
     } 
    ] 
} 

Следующая делает работу подсчета, сколько документов с кодом события/обновление/типа:

{ 
    $group: { 

     _id: { eventID: "$eventName", updateID: "$update", sentiment: "$type" } 

    } 
}, 

Но выход просто плоский массив каждого. Есть ли способ, чтобы агрегат производил вложенный объект, такой как выше?

ответ

2

Сначала вы могли группа по eventID и update, а затем группы по eventID, при этом $pushupdate в массив

{$group: { 
    _id: {eventID: '$eventID', update: '$update'}, 
    voteup: {$sum: {$cond: [ 
      {$eq: ['$type', {$literal: 'voteup'}]}, 
      1, 
      0 
     ]}}, 
    votedown: {$sum: {$cond: [ 
      {$eq: ['$type', {$literal: 'voteup'}]}, 
      0, 
      1 
     ]}} 
}}, 

{$group: { 
    _id: {eventID: '$id.eventID'}, 
    updates: {$push: { 
     update: '$_id.update', 
     voteup: '$voteup', 
     votedown: '$votedown' 
    }} 
}} 
+0

Одна крошечная ошибка в там; во второй группе $ id.eventID должен быть $ _id.eventID. – Squidinker

+0

... но ваше решение * точно *, что я был после. Спасибо! – Squidinker

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