2015-04-08 14 views
5

Es scheint, dass meine Anfrage wird nicht handeln wie meineWie mehrere Spalten Wert innerhalb der Gruppe schieben

erwarte ich von name und Mapping location1 und location2 in ein Array namens locations

Daten gruppieren möchten

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

Erwartetes Ergebnis

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

Abfrage

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

Antwort

7

Sie können den Operator $setUnion verwenden. Für andere Operatoren setzen lesen this.

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

Ausgabe

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

können Sie auch den $setUnion Operator in Ihrer $project Pipeline wie folgt verwenden:

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

geben Sie das Ergebnis:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "name" : "Mary", 
      "locations" : [ 
       "China", 
       "Taiwan" 
      ] 
     }, 
     { 
      "name" : "Jack", 
      "locations" : [ 
       "Japan", 
       "Taiwan", 
       "France" 
      ] 
     } 
    ], 
    "ok" : 1 
} 
Verwandte Themen