'How to sort a populated document in find request?
I would like to sort a populated Document from the collection i fetch, i get an error requesting it.
Let's admit a Document Group (Group) and 'Member' (Group.Members)
Group
.find({})
.populate('Members')
Works perfectly, but i would like to sort it so i do this:
Group
.find({})
.populate('Members', ['_id', 'name'], null, { sort: [[ 'created_at', 'desc' ]] })
I get the error TypeError: Invalid select() argument. Must be a string or object. by adding this...
Solution 1:[1]
You can also explicitly specify only required parameters of populate:
Group
.find({})
.populate({path: 'Members', options: { sort: { 'created_at': -1 } } })
Have a look at http://mongoosejs.com/docs/api.html#document_Document-populate
Solution 2:[2]
And for Mongoose 4.x use this syntax:
Kitten.find().populate({
path: 'owner'
, select: 'name'
, match: { color: 'black' }
, options: { sort: { name: -1 }}
}).exec(function (err, kittens) {
console.log(kittens[0].owner.name) // Zoopa
})
// alternatively
Kitten.find().populate('owner', 'name', null, {sort: { name: -1 }}).exec(function (err, kittens) {
console.log(kittens[0].owner.name) // Zoopa
})
Reference: Mongoose docs
Solution 3:[3]
This worked correctly for me in Mongoose Versions 5 and above.
Clinics.findById(req.params.id).populate({path:'users',options:{ sort:{date : 1}}}).exec(callback);
Solution 4:[4]
The following worked for me in Mongoose v5.0.5:
Schedule.find({})
.populate({path: 'eventComments', options: {sort:{"commentDate": "descending"}}})
.exec(function(err, result) {
if (err) {
throw err
}
else {
return res.json(result);
}
});
P.S. The key difference between this example and the Kitten example is that commentDate is in quotes, whereas Date (in the Kitten example) is not. This alteration may be necessary for some of you. Hope this helps.
Solution 5:[5]
I ended up needing to populate a nested document, this worked for me:
const video = await Video.findOne({ urlId }) // find video
.populate('likes user') // populate the likes and owner (user) of video
.populate({
path: 'comments', // populate the comments as well,
options: { sort: { date: -1 } }, // sorting the comments by date
populate: {
path: 'user', // and populating the owner (user) of each comment,
select: 'username, date', // plucking whichever fields necessary from the User model
},
})
]);
Solution 6:[6]
Comment.find({}).populate({path: 'comments', options: { sort: '-createdAt'} });
-createdAt -> here - is for descending order
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Wtower |
| Solution 3 | Gaurang Dave |
| Solution 4 | NBB |
| Solution 5 | Mike K |
| Solution 6 | Rajesh Behera |
