如何在查找请求中对填充的文档进行排序?

Lud*_*udo 29 mongoose

我想从我收集的集合中对填充的文档进行排序,我收到错误请求它.

让我们承认一个文件Group(组)和'会员'(Group.Members)

Group
  .find({})
  .populate('Members')
Run Code Online (Sandbox Code Playgroud)

工作完美,但我想排序,所以我这样做:

Group
  .find({})
  .populate('Members', ['_id', 'name'], null, { sort: [[ 'created_at', 'desc' ]] })
Run Code Online (Sandbox Code Playgroud)

TypeError: Invalid select() argument. Must be a string or object.通过添加这个错误得到错误...

Art*_*sov 52

您还可以隐式指定populate所需的参数:

Group
  .find({})
  .populate({path: 'Members', options: { sort: { 'created_at': -1 } } })
Run Code Online (Sandbox Code Playgroud)

看看http://mongoosejs.com/docs/api.html#document_Document-populate


Lud*_*udo 20

上面的这个例子适用于Mongoose 2.x,使用Mongoose 3.x,使用这个synwtax:

Group
  .find({})
  .populate('Members', '_id name', null, { sort: { 'created_at': -1 } })
Run Code Online (Sandbox Code Playgroud)

  • @KannanT ,这仅代表从 mebers 集合中选择 _id 和 name 字段 (2认同)

Wto*_*wer 12

对于Mongoose 4.x,请使用以下语法:

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
})
Run Code Online (Sandbox Code Playgroud)

参考:Mongoose docs

  • 我认为这是一个确认的错误,请看一下:https://github.com/Automattic/mongoose/issues/2202. (3认同)
  • 我使用mongoose 4.6,我的代码看起来像`.populate({path:'bookedFor.id',select:'name mobileNumber',options:{sort:{mobileNumber:-1}}})`但它不是工作,谁能指出错误? (2认同)

小智 5

在Mongoose版本5及更高版本中,这对我来说是正确的。

Clinics.findById(req.params.id).populate({path:'users',options:{ sort:{date : 1}}}).exec(callback);
Run Code Online (Sandbox Code Playgroud)