2012-11-08 38 views
20

Tôi có một bộ sưu tập lồng nhau sâu trong bộ sưu tập MongoDB của mình.Có thể làm phẳng truy vấn kết quả MongoDB không?

Khi tôi chạy truy vấn sau đây:

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

tôi kết thúc với kết quả lồng này ở đây:

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

Bây giờ, đây là những gì tôi muốn:

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

hoặc này:

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

hoặc bất kỳ điều gì khác tương tự ... Điều này có thể không?

Trả lời

35

Bạn có thể sử dụng $project & $unwind & $group của aggregation khuôn khổ để có được kết quả gần gũi hơn với yêu cầu của bạn.

> 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 sử dụng hai lần vì mảng tên được lồng sâu. Và nó sẽ chỉ hoạt động nếu thuộc tính neighbor là một mảng. Trong ví dụ của bạn, một trường lân cận (Malaysia) không phải là mảng

+0

Cảm ơn! Tôi nhận được sau đây mặc dù: '{" kết quả ": []," ok ": 1}':/ – Gevorg

+0

@Gevorg, cập nhật câu trả lời. xin vui lòng kiểm tra – RameshVel

+0

Thú vị. Nó vẫn cảm thấy như rất nhiều công việc nhưng tôi đoán rằng tôi sẽ phải làm quen với nó. Cảm ơn – Gevorg

0

Khá đơn giản dưới aggregation framework mới. Các dự án $ và $ thư giãn hoạt động là đúng cho mục đích này.

Các vấn đề liên quan