2012-11-08 15 views
20

MongoDB koleksiyonumda derin bir iç içe geçmiş koleksiyonum var.MongoDB sonuç sorgusunu düzleştirmek mümkün mü?

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

Burada bu iç içe sonuçla sona: Ben aşağıdaki sorguyu çalıştırdığınızda

Şimdi

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

, bu benim istediğim şey:

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

veya Bu:

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

veya benzeri başka bir şey ... Bu mümkün mü?

cevap

35

Eğer sizin ihtiyacına sonuç yaklaşmak için $project & $unwind & $groupaggregation çerçevenin kullanabilirsiniz. adı dizinin bu yana iki kez kullanılan

> 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

derin yuvalanır. Ve sadece neighbor özniteliği bir dizi ise çalışır. Örneğinizde bir komşu alan (Malezya) bir dizi değil

+0

Teşekkürler! Aşağıdakileri alıyorum: '{" result ": []," ok ": 1}':/ – Gevorg

+0

@Gevorg, cevabı güncelledi. pls kontrol etmek – RameshVel

+0

İlginç. Hala çok iş gibi geliyor ama sanırım buna alışmalıyım. Teşekkürler – Gevorg

0

Yeni aggregation framework altında oldukça basit. $ Project ve $ unwind operasyonu amaç için doğru.