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

时间:2013-05-03 06:15:33

标签: mongoose

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

让我们承认文件Group(小组)和'会员'(小组成员)

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

7 个答案:

答案 0 :(得分:48)

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

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

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

答案 1 :(得分:16)

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

Group
  .find({})
  .populate('Members', '_id name', null, { sort: { 'created_at': -1 } })

答案 2 :(得分:11)

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

double

参考:bruteforce

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

以下在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。此示例与Kitten示例之间的主要区别在于 commentDate 是引号,而 Date (在Kitten示例中)则不是。有些人可能需要这种改动。希望这可以帮助。

答案 5 :(得分: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
            },
        })
]);

答案 6 :(得分:-1)

此代码对我有用,可能会对您有所帮助

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