MongoDB按自定义字段排序集合

Posted

技术标签:

【中文标题】MongoDB按自定义字段排序集合【英文标题】:MongoDB sort collection by custom field 【发布时间】:2018-01-25 13:39:46 【问题描述】:

我有聚合查询,看起来像这样:

aggregate.append([
            $sort: paginateOptions.sort,
            $match: paginateOptions.match,
            $skip: (paginateOptions.page - 1) * paginateOptions.limit,
            $limit: paginateOptions.limit,
            
                $lookup: 
                    from: 'users',
                    localField: 'owner',
                    foreignField: '_id',
                    as: 'owner'
                
            ,
            
                $unwind: 
                    path: '$owner',
                    preserveNullAndEmptyArrays: true
                
            ,
            
                $project: 
                    name: 
                        $concat: ["$firstname", " ", "$lastname"]
                    ,
                    email: 1,
                    owner: 
                        _id: 1,
                        username: 1
                    ,
                    last_note: 
                        $arrayElemAt: ["$notes", -1]
                    
                
            
        ])

我想按最后一个音符时间字段 (last_note.time) 排序。 问题是,这个字段是在项目过程中创建的,如果我在项目之后添加一个排序,我将只对限制文档进行排序,而不是整个集合(因为它将在限制和跳过..)

我能做什么?

【问题讨论】:

【参考方案1】:

你应该在跳过和限制之前排序:

 `[
$match: paginateOptions.match,
$lookup: 
                from: 'users',
                localField: 'owner',
                foreignField: '_id',
                as: 'owner'
            
        ,
$unwind: 
                path: '$owner',
                preserveNullAndEmptyArrays: true
            
        ,
$project: 
                name: 
                    $concat: ["$firstname", " ", "$lastname"]
                ,
                email: 1,
                owner: 
                    _id: 1,
                    username: 1
                ,
                last_note: 
                    $arrayElemAt: ["$notes", -1]
                
            
 ,
 $sort: paginateOptions.sort,
 $skip: (paginateOptions.page - 1) * paginateOptions.limit,
 $limit: paginateOptions.limit,
    ]`

【讨论】:

这样查询的性能会很差。排序应该在项目之前,也是跳过和限制,来自 mongodb 文档

以上是关于MongoDB按自定义字段排序集合的主要内容,如果未能解决你的问题,请参考以下文章

PHP Wordpress:按自定义字段对特定类别排序

按自定义字段值订购wordpress帖子?

按自定义模式排序列

在 Eloquent 中按自定义顺序对集合进行排序 [重复]

按自定义字段过滤帖子 - url 正确更新但过滤不起作用

Woocommerce 集团订单总额按自定义字段日期