【问题标题】:MongoDB sort collection by custom fieldMongoDB按自定义字段排序集合
【发布时间】: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) 排序。 问题是,这个字段是在项目过程中创建的,如果我在项目之后添加一个排序,我将只对限制文档进行排序,而不是整个集合(因为它将在限制和跳过..)

我能做什么?

【问题讨论】:

    标签: mongodb mongoose aggregation-framework database


    【解决方案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 文档
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多