2012-11-08 90 views
20

我在我的MongoDB集合中有深度嵌套的集合。是否可以扁平化MongoDB結果查詢?

當我運行以下查詢:

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

我結束了這種嵌套結果在這裏:

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

現在,這就是我想要的:

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

或這個:

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

或其他類似的東西......這可能嗎?

回答

35

可以使用aggregation框架$project & $unwind & $group得到的結果更貼近您的需求。

> 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嵌套深。而且它只會在neighbor屬性是一個數組時才起作用。在你的例子中,一個鄰居字段(馬來西亞)不是數組

+0

謝謝!雖然我得到了以下內容:'{「result」:[],「ok」:1}':/ – Gevorg

+0

@Gevorg,更新了答案。請退房 – RameshVel

+0

有趣。它仍然感覺像很多工作,但我想我只需要適應它。謝謝 – Gevorg