MongoDB的排序收集通过自定义字段
问题描述:
我有聚集的查询,看起来像这样:MongoDB的排序收集通过自定义字段
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)进行排序。 问题是,该字段是在项目过程中创建的,如果我将在项目之后添加一个排序,我将只对限制文档进行排序,而不是对整个集合进行排序(因为它将在限制之后并跳过..)
我该怎么办?
答
你应该排序跳过之前与限制:
`[
{$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文档中,排序应该在项目之前,也是跳过和限制 – user3712353