34

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

让我们承认一个文档Group(组)和“成员”(Group.Members)

Group
  .find({})
  .populate('Members')

完美运行,但我想对其进行排序,所以我这样做:

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

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

4

6 回答 6

70

您还可以仅显式指定填充的必需参数:

Group
  .find({})
  .populate({path: 'Members', options: { sort: { 'created_at': -1 } } })

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

于 2013-08-30T17:01:47.590 回答
25

上面的这个例子适用于 Mongoose 2.x 及更高版本,使用以下语法:

Group
  .find({})
  .populate('Members', '_id name', null, { sort: { 'created_at': -1 } })
于 2013-05-03T07:03:26.213 回答
17

对于 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
})

参考:猫鼬文档

于 2016-07-20T09:25:33.913 回答
7

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

Clinics.findById(req.params.id).populate({path:'users',options:{ sort:{date : 1}}}).exec(callback);
于 2018-03-29T06:50:21.947 回答
2

以下内容在 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);
            }
    });

PS 这个例子和 Kitten 例子的主要区别是commentDate是用引号引起来的,而Date(在 Kitten 例子中)不是。对于你们中的一些人来说,这种改变可能是必要的。希望这可以帮助。

于 2018-02-14T17:59:58.853 回答
0

我最终需要填充一个嵌套文档,这对我有用:

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
            },
        })
]);
于 2020-09-18T08:09:03.243 回答