Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to sort a populated document in find request?

Tags:

mongoose

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...

like image 640
Ludo Avatar asked May 03 '13 06:05

Ludo


4 Answers

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

like image 166
Artem Fedosov Avatar answered Nov 14 '22 06:11

Artem Fedosov


This example above works with Mongoose 2.x and above, use this syntax:

Group
  .find({})
  .populate('Members', '_id name', null, { sort: { 'created_at': -1 } })
like image 40
Ludo Avatar answered Nov 14 '22 08:11

Ludo


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

like image 18
Wtower Avatar answered Nov 14 '22 08:11

Wtower


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);
like image 8
yogesh joshi Avatar answered Nov 14 '22 07:11

yogesh joshi