2012-11-08 11 views
20

Mam głęboko zagnieżdżoną kolekcję w mojej kolekcji MongoDB.Czy można spłaszczyć wyniki zapytania MongoDB?

Kiedy uruchomić następujące zapytanie:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0}) 

I skończyć z tego pod wyniku tutaj:

{"data" : { 
    "country" : [ 
    { 
     "neighbor" : [ 
     { 
      "name" : "Austria" 
     }, 
     { 
      "name" : "Switzerland" 
     } 
     ] 
    }, 
    { 
     "neighbor" : { 
     "name" : "Malaysia" 
     } 
    }, 
    { 
     "neighbor" : [ 
     { 
      "name" : "Costa Rica" 
     }, 
     { 
      "name" : "Colombia" 
     } 
     ] 
    } 
    ] 
}} 

Teraz, to jest to, co chcę:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia'] 

lub to:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']} 

lub cokolwiek innego podobnego ... Czy to możliwe?

Odpowiedz

35

Można użyć $project & $unwind & $group od aggregation ram, aby uzyskać wynik bliżej do Państwa wymagań.

> db.countries.aggregate({$project:{a:'$data.country.neighbor.name'}}, 
         {$unwind:'$a'}, 
         {$unwind:'$a'}, 
         {$group:{_id:'a',res:{$addToSet:'$a'}}}) 
    { 
    "result" : [ 
     { 
      "_id" : "a", 
      "res" : [ 
       "Colombia", 
       "Malaysia", 
       "Switzerland", 
       "Costa Rica", 
       "Austria" 
      ] 
     } 
    ], 
    "ok" : 1 
} 

$unwind dwukrotnie, od tablicy nazw zagnieżdżony głębokości. I będzie działać tylko wtedy, gdy atrybut neighbor jest tablicą. W twoim przykładzie pole sąsiada (Malezja) nie jest tablicą

+0

Dzięki! Dostaję jednak następujące rzeczy: '{" result ": []," ok ": 1}':/ – Gevorg

+0

@Gevorg, zaktualizował odpowiedź. pls check out – RameshVel

+0

Interesujące. Nadal czuje się dużo pracy, ale myślę, że po prostu muszę się do tego przyzwyczaić. Dzięki – Gevorg

Powiązane problemy