2012-11-08 6 views
20

Ho una collezione profondamente annidata nella mia collezione MongoDB.È possibile appiattire la query sui risultati di MongoDB?

Quando eseguo la seguente query:

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

io alla fine con questo risultato nidificato qui:

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

Ora, questo è quello che voglio:

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

o this:

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

o qualsiasi altra cosa simile ... È possibile?

risposta

35

È possibile utilizzare $project & $unwind & $group di aggregation quadro per ottenere il risultato più vicino alla vostra esigenza.

> 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 usato due volte dopo l'array nome è annidato profondo. E funzionerà solo se l'attributo neighbor è un array. Nel tuo esempio un campo adiacente (Malesia) non è un array

+0

Grazie! Sto ottenendo quanto segue: '{" risultato ": []," ok ": 1}':/ – Gevorg

+0

@Gevorg, ha aggiornato la risposta. pls check out – RameshVel

+0

Interessante. Sembra ancora un sacco di lavoro, ma credo che mi ci dovrò abituare. Grazie – Gevorg

0

È piuttosto semplice con il nuovo aggregation framework. L'operazione $ project e $ unwind sono giuste allo scopo.