2012-11-08 7 views
20

Ich habe eine tief verschachtelte Sammlung in meiner MongoDB-Sammlung.Ist es möglich, die MongoDB-Ergebnisabfrage zu reduzieren?

Wenn ich die folgende Abfrage ausführen:

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

ich mit diesem verschachtelten Ergebnis am Ende hier:

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

Nun, das ist, was ich will:

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

oder dies:

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

oder irgendetwas anderes ähnlich ... Ist das möglich?

Antwort

35

können Sie $project & $unwind & $group von aggregation Framework verwenden das Ergebnis näher an Ihre Anforderung zu erhalten.

> 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 zweimal seit dem Namen Array verwendet wird tief verschachtelt. Und es funktioniert nur, wenn das neighbor Attribut ein Array ist. In Ihrem Beispiel ist ein Nachbarfeld (Malaysia) kein Array

+0

Vielen Dank! Ich bekomme aber folgendes: '{" result ": []," ok ": 1}':/ – Gevorg

+0

@Gevorg, aktualisierte die Antwort. Bitte überprüfen Sie – RameshVel

+0

Interessant. Es fühlt sich immer noch nach viel Arbeit an, aber ich denke, dass ich mich erst daran gewöhnen muss. Vielen Dank – Gevorg

0

Es ist ziemlich einfach unter dem neuen . Die Operationen $ project und $ unload sind für diesen Zweck geeignet.

Verwandte Themen