2016-06-27 4 views
1

У меня есть ниже структуры документа:MongoDB группа полем для различных элементов массива в суб документе

{ 
    "_id" : ObjectId("576c5402eef7285c58f6a681"), 
    "asOfDate" : 20160602, 
    "universe" : [ 
     { 
      "memberOf" : [ 
       "group1", 
       "group2", 
       "group3", 
       "group4", 
       "group5" 
      ], 
      "personName" : "John" 
     }, 
     { 
      "memberOf" : [ 
       "group22", 
       "group2", 
      ], 
      "personName" : "Mary" 
     }] 
}, 
{ 
    "_id" : ObjectId("576c5402eef7285c58f6a684"), 
    "asOfDate" : 20160603, 
    "universe" : [ 
     { 
      "memberOf" : [ 
       "group1", 
       "group2", 
       "group6" 
      ], 
      "personName" : "Chris" 
     }, 
     { 
      "memberOf" : [ 
       "group7", 
       "group5", 
      ], 
      "personName" : "Jack" 
     }] 
} 

Я пытаюсь получить список отчетливым universe.memberOf для каждого из asOfDates в коллекции. Требуемый выход ниже. Единственный способ, которым я мог понять, - это запустить отчетливый для каждой даты. Но мне придется зацикливаться на каждую дату, что может оказаться неэффективным.

{ 
    20160602 : ["group1", "group2", "group3", "group4", "group5", "group22"], 

    20160603 : ["group1", "group2", "group6", "group7", "group5"] 
} 

ответ

0

С агрегации трубопровода он может выглядеть так

db.getCollection('fooBar').aggregate([ 
    { 
     $unwind: { 
     path: "$universe" 
     } 
    }, 
    { 
     $unwind: { 
     path: "$universe.memberOf" 
     } 
    }, 
    { 
    $group: { 
     _id: "$asOfDate", 
     memberOf: { 
      $addToSet: "$universe.memberOf" 
     } 
    } 
    } 
]) 

, что приведет к

/* 1 */ 
{ 
    "_id" : 20160603, 
    "memberOf" : [ 
     "group5", 
     "group7", 
     "group6", 
     "group2", 
     "group1" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : 20160602, 
    "memberOf" : [ 
     "group22", 
     "group5", 
     "group3", 
     "group1", 
     "group2", 
     "group4" 
    ] 
} 
+0

Hi DAXaholic. Большое спасибо за ваше решение. Это именно то, что я искал. Просто, когда у вас появится шанс, вы можете пролить свет, чтобы выяснить, зачем нам цепляться за операции размотки? Еще раз спасибо. – user3516370

+0

Добро пожаловать. $ unwind может только разматывать один уровень за раз, поэтому сначала нам нужно развернуть массив юниверса, а затем массив memberOf. – DAXaholic

+0

Прохладный, спасибо человеку! Готово принято! – user3516370