Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename populate returned values Mongoose

I am trying to return returned properties, much like in Mysql's AS. But with renamed object properties.

Query

Games.find({leagueID:leagueID, result:{$ne: null}}).populate('home_id away_id').sort({date: -1}).execAsync()

Output

{
    home_id: {
        ...some details
    },
    away_id: {
        ...some details
    }
}

Desired Output

{
    home: {
        ...some details
    },
    away: {
        ...some details
    }
}

So how can I get the desired outcome?

like image 759
Jamie Hutber Avatar asked Sep 25 '15 07:09

Jamie Hutber


2 Answers

My solution is to use the transform function.

GamesSchema.set('toJSON', {
    transform: function(doc, ret, options) {   
        if (mongoose.Types.ObjectId.isValid(ret.home)) {
            ret.homeId = ret.home;
            delete ret.home;
        }
        if (mongoose.Types.ObjectId.isValid(ret.away)) {
            ret.awayId = ret.away;
            delete ret.away;
        }
    }
});

Without populate:

Input

{
    "_id": "sD95OhsGrWVIqmTLVeuQdkna",
    "leagueID": 1000,
    "home": "404d1d9f68c3bb386b50f440" // ObjectId
    "away": "504d1d9f68c3bb386b50f450" // ObjectId
}

Output

{
    "_id": "sD95OhsGrWVIqmTLVeuQdkna",
    "leagueID": 1000,
    "homeId": "404d1d9f68c3bb386b50f440"
    "awayId": "504d1d9f68c3bb386b50f450"
}

With populate:

Input

{
    "_id": "sD95OhsGrWVIqmTLVeuQdkna",
    "leagueID": 1000,
    "home": "404d1d9f68c3bb386b50f440" // ObjectId
    "away": "504d1d9f68c3bb386b50f450" // ObjectId
}

Output

{
    "_id": "sD95OhsGrWVIqmTLVeuQdkna",
    "leagueID": 1000,
    "home": {
        "_id": "404d1d9f68c3bb386b50f440",
        "name": "Home"
    }
    "away": {
        "_id": "504d1d9f68c3bb386b50f450",
        "name": "Away"
    }
}
like image 56
Hank Frinkle Avatar answered Oct 28 '22 21:10

Hank Frinkle


You can use aggregation and manipulate the output field like this

db.collection.aggregate([{ $project:{_id:0, home:"$home_id", away:"$away_id"} }])

like image 34
Rohit Jain Avatar answered Oct 28 '22 21:10

Rohit Jain