2015-04-08 21 views
5

Dường như truy vấn của tôi sẽ sẽ không hoạt động như mong đợi của tôiLàm thế nào để đẩy giá trị nhiều cột trong nhóm

Tôi muốn nhóm bởi name và lập bản đồ LOCATION1 và LOCATION2 vào một mảng gọi locations

liệu

{name: "Jack", localtion1: "Taiwan", localtion2: "France"}, 
{name: "Jack", localtion1: "Japan", localtion2: "Taiwan"}, 
{name: "Mary", localtion1: "China", localtion2: "Taiwan"} 

kết quả mong đợi

{ 
    name: "Jack", 
    localtions: ["Taiwan", "France", "Japan"] 
}, 
{name: "Mary", localtions: ["China", "Taiwan"]} 

Truy vấn

db.collection.aggregate([ 
    { 
     $group: { 
      _id: "$name", 
      "localtions":{ 
       $addToSet: "$localtion1" 
      }, 
      "localtions":{ 
       $addToSet: "$localtion2" 
      }    
      count: { $sum: 1 } 
     } 
    }, 
    { 
     $project: { 
      name: "$_id", 
      localtions: "$localtions", 
      _id: 0 
     } 
    },  
]) 

Trả lời

7

Bạn có thể sử dụng toán tử $setUnion. Đối với những người khác , hãy đặt toán tử đọc this.

db.collection.aggregate([ 
     { 
      "$group": { 
       "_id": "$name", 
       "localtion1": { "$addToSet": "$localtion1" }, 
       "localtion2": { "$addToSet": "$localtion2" } 
      } 
     }, 
     { 
      "$project": { 
       "name": "$_id", 
       "localtions": { "$setUnion": [ "$localtion1", "$localtion2" ] }, 
       "_id": 0 
      } 
     } 
]) 

Output

{ "name" : "Mary", "localtions" : [ "Taiwan", "China" ] } 
{ "name" : "Jack", "localtions" : [ "France", "Japan", "Taiwan" ] } 
1

Bạn cũng có thể sử dụng toán tử $setUnion trong $project đường ống của bạn như sau:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$name", 
      "location1": { 
       "$addToSet": "$localtion1" 
      }, 
      "location2": { 
       "$addToSet": "$localtion2" 
      } 
     } 
    }, 
    { 
     "$project": {    
      "name": "$_id", 
      "locations": { 
       "$setUnion": [ "$location1", "$location2" ] 
      }, 
      "_id": 0    
     } 
    } 
]) 

sẽ cung cấp cho bạn kết quả:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "name" : "Mary", 
      "locations" : [ 
       "China", 
       "Taiwan" 
      ] 
     }, 
     { 
      "name" : "Jack", 
      "locations" : [ 
       "Japan", 
       "Taiwan", 
       "France" 
      ] 
     } 
    ], 
    "ok" : 1 
} 
Các vấn đề liên quan