2015-02-07 3 views
1

вложенные документы Имея список документовMongoDB Совокупные вложенными

[ 
{ 
    "__v" : 21, 
    "_id" : ObjectId("546330dbb8926d177052e9ff"), 
    "code" : "WfvCc", 
    "description" : "", 
    "elements" : [ 
     { 
      "_id" : ObjectId("546471f61e13b76a0b20ccaf"), 
      "comments" : [], 
      "meta" : { 
       "createdBy" : "545ab39ef1b0c88a695fcf8d", 
       "modifiedAt" : "1415868918045", 
       "createdAt" : "1415868918045" 
      }, 
      "title" : "awesome title", 
      "votes" : { 
       "count" : 3, 
       "meta" : [ 
        { 
         "createdBy" : "545ab39ef1b0c88a695fcf8d", 
         "_id" : ObjectId("546473831e13b76a0b20ccb7"), 
         "createdAt" : "1415869315618" 
        }, 
        { 
         "createdBy" : "545aaddcf1b0c88a695fcf84", 
         "_id" : ObjectId("546473d71e13b76a0b20ccbc"), 
         "createdAt" : "1415869399584" 
        }, 
        { 
         "createdBy" : "5461c0e2c9c39a192c44226c", 
         "_id" : ObjectId("546474041e13b76a0b20ccbe"), 
         "createdAt" : "1415869444056" 
        } 
       ] 
      } 
     } 
    ] 
}, 
{ 
    "__v" : 21, 
    "_id" : ObjectId("546330dbb8926d177052e9ff"), 
    "code" : "WfvCc", 
    "description" : "", 
    "elements" : [ 
     { 
      "_id" : ObjectId("546471f61e13b76a0b20ccaf"), 
      "comments" : [], 
      "meta" : { 
       "createdBy" : "545ab39ef1b0c88a695fcf8d", 
       "modifiedAt" : "1415868918045", 
       "createdAt" : "1415868918045" 
      }, 
      "title" : "awesome title", 
      "votes" : { 
       "count" : 3, 
       "meta" : [ 
        { 
         "createdBy" : "545ab39ef1b0c88a695fcf8d", 
         "_id" : ObjectId("546473831e13b76a0b20ccb7"), 
         "createdAt" : "1415869315618" 
        }, 
        { 
         "createdBy" : "545aaddcf1b0c88a695fcf84", 
         "_id" : ObjectId("546473d71e13b76a0b20ccbc"), 
         "createdAt" : "1415869399584" 
        }, 
        { 
         "createdBy" : "5461c0e2c9c39a192c44226c", 
         "_id" : ObjectId("546474041e13b76a0b20ccbe"), 
         "createdAt" : "1415869444056" 
        } 
       ] 
      } 
     } 
    ] 
} 
] 

Я хотел бы объединить список пользователей ака. elements.votes.meta.createdBy по всем документам и подсчитать общее количество записей в документе. * Обратите внимание, что elements.votes.meta.createdBy уникален для каждого документа, поэтому теоретически это должно быть проще.

До сих пор, я закончил с запросом:

db.sessions.aggregate(
    { $project: { 
     meta: "$elements.votes.meta" 
    }}, 
    { $unwind: "$meta" }, 
    { $group: { 
     _id: "voters", 
     voters: { 
      $addToSet: "$meta.createdBy" 
     } 
    }} 
) 

Просто, чтобы полностью застрял снова. Я знаю, что мне нужна двойная группировка, просто не могу понять ее. Любая помощь оценивается.

ответ

6

Сначала вы должны получить итоговые значения для каждого пользователя. (т. е. {$ group: {_id: '$ user', count: {'$ sum': 1}}})

Тогда просто сгруппируйте по null, чтобы создать документ с результатом, добавьте каждого пользователя в установить и вывести результат из первой группировки в поле массива. (Вторая группировка)

db.test5.aggregate(
    { $unwind: "$elements" }, 
    { $unwind: "$elements.votes.meta" }, 
    { $project: {_id: '$_id', user: '$elements.votes.meta.createdBy'} }, 
    { $group: {_id: '$user', count: {'$sum': 1} }}, 
    { $group: { 
     _id: null, 
     users: {$addToSet: '$_id'}, 
     occurances: {$push: {'user': '$_id', count: '$count'}} 
     } 
    } 
) 

Результат:

{ 
    "result" : [ 
     { 
      "_id" : null, 
      "users" : [ 
       "545ab39ef1b0c88a695fcf8d", 
       "545aaddcf1b0c88a695fcf84", 
       "5461c0e2c9c39a192c44226c" 
      ], 
      "occurances" : [ 
       { 
        "user" : "5461c0e2c9c39a192c44226c", 
        "count" : 2 
       }, 
       { 
        "user" : "545aaddcf1b0c88a695fcf84", 
        "count" : 2 
       }, 
       { 
        "user" : "545ab39ef1b0c88a695fcf8d", 
        "count" : 2 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 
+0

удивительным, с небольшими изменениями это именно то, что я искал. Ключ должен был удвоить набор $. Ура! –

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