2015-04-08 18 views
5

Wydaje moje zapytanie nie będzie działać jako mój oczekiwaćJak przesunąć wartość wielu kolumnach w grupie

Chcę grupować przez name i mapowanie Location1 i Location2 do tablicy o nazwie locations

danych

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

Oczekiwany wynik

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

Pytanie

Odpowiedz

7

Można użyć operatora $setUnion. Dla innych operatorów ustawia operatorów przeczytać this.

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

Wyjście

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

Można również użyć operatora $setUnion w $project rurociągu następująco:

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

daje wynik:

/* 0 */ 
{ 
    "result" : [ 
     { 
      "name" : "Mary", 
      "locations" : [ 
       "China", 
       "Taiwan" 
      ] 
     }, 
     { 
      "name" : "Jack", 
      "locations" : [ 
       "Japan", 
       "Taiwan", 
       "France" 
      ] 
     } 
    ], 
    "ok" : 1 
} 
Powiązane problemy