2013-04-04 17 views
7

Oto moja kolekcja MongoDB:MongoDB - Agregacja - Aby uzyskać unikalne przedmioty w tablicy

{ 
    "_id" : ObjectId("515d8f53175b8ecb053425c2"), 
    "category" : "Batteries", 
    "products" : [ 
     { 
      "brand" : "Duracell", 
      "item" : [ 
       "AA", 
       "AAA" 
      ] 
     }, 
     { 
      "brand" : "Everyday", 
      "item" : [ 
       "9V", 
       "AA", 
       "12V" 
      ] 
     } 
    ] 
} 

Wyjście że muszę to

1) Wyjątkowa lista wszystkich przedmiotów

{["AA", "AAA", "9V", "12V"]} 

i 2. unikatowa lista pozycji na produkt:

{ 
    "category" : "Batteries", 
    "item": ["AA", "AAA", "9V", "12V"] 
} 

Jestem bardzo nowy w MongoDB i próbowałem różnych funkcji agregacji i nic nie działa. Proszę pomóż.

Odpowiedz

14

Po kilku kolejnych próbach rozwiązałem to. Oto polecenia:

db.xyz.aggregate({$project: {a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: 'a', items: {$addToSet: '$a'}}}); 

i

db.xyz.aggregate({$project: {category: 1, a: '$products.item'}}, 
    {$unwind: '$a'}, 
    {$unwind: '$a'}, 
    {$group: {_id: '$category', items: {$addToSet: '$a'}}}); 
+4

Dlaczego $ rozwijasz dwa razy? – Devesh

+6

ponieważ "element" jest zagnieżdżony w tablicy. – Ananth

0

Nie jestem pewien, co wypróbowałeś w funkcji agregacji, ale myślę, że odprężenie pomoże ci zrobić to samo, zakładając, że nie jesteś w stanie tego zrobić, mamy mapę-redukcję, która pozwoli ci łatwo to zrobić. Możesz zajrzeć do http://docs.mongodb.org/manual/applications/map-reduce/. To pozwala na uzyskanie danych w sposób, który chcesz i możesz łatwo uzyskać listę. Myślę, że $ unwind w kolumnie tags, a następnie $ group one zawsze da nam listę odrębnych znaczników wymaganych przez ciebie w 1, a dla drugiego przypadku utwórz $ group na dwóch kluczowych kategoriach i pozycji, która była $ unwind wcześniej.

+0

Devesh, dzięki za odpowiedź. Udało mi się to rozwiązać za pomocą samej agregacji. Wysłałem też moją odpowiedź. – Ananth