6

It seems my query will won't act as my expect

I want to group by name and mapping location1 and location2 into an array called locations

Data

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

Expected result

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

Query

db.collection.aggregate([
    {
        $group: {
            _id: "$name",
            "localtions":{
                $addToSet: "$localtion1"
            },
            "localtions":{
                $addToSet: "$localtion2"
            }            
            count: { $sum: 1 }
        }
    },
    {
        $project: {
            name: "$_id",
            localtions: "$localtions",
            _id: 0
        }
    },    
])
styvane
  • 59,869
  • 19
  • 150
  • 156
newBike
  • 14,385
  • 29
  • 109
  • 192

2 Answers2

11

You can use the $setUnion operator. For others set operators read 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" ] }
styvane
  • 59,869
  • 19
  • 150
  • 156
1

You can also use the $setUnion operator in your $project pipeline as follows:

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

Will give you the result:

/* 0 */
{
    "result" : [ 
        {
            "name" : "Mary",
            "locations" : [ 
                "China", 
                "Taiwan"
            ]
        }, 
        {
            "name" : "Jack",
            "locations" : [ 
                "Japan", 
                "Taiwan", 
                "France"
            ]
        }
    ],
    "ok" : 1
}
chridam
  • 100,957
  • 23
  • 236
  • 235