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按自定义字段排序集合的主要内容,如果未能解决你的问题,请参考以下文章