跳过阶段在此mongo数据库聚合框架管道的开头不起作用:
[
{
$skip: (!offset)? 0 :(offset-1)*limit
},
{
$match: (query)? query : {}
}
,
{
$lookup: ...,
},
{
$lookup:..,
},
{
$addFields: {
userReact: {
$arrayElemAt: [
{
$map: {
input: {
$filter: {
input: '$reacts',
as: 'react',
cond: { $eq: ['$$react.publisher', viewerUserName || ''] },
},
},
as: 'react',
in: '$$react.reactType',
},
},
0,
],
}
},
},
{
$project: {
labels: 0,
comments: 0,
__v: 0,
reacts: 0,
publisher: 0,
},
},
{
$sort: {
"publishDate": -1
}
},
{
$limit: limit
}
]
但我这么说的话就行了
[
<Same stages>
{
$skip: (!offset)? 0 :(offset-1)*limit
},
{
$limit: limit
}
]
我想知道什么样的手术会影响它以及最佳实践是什么。把跳跃台放在最上面比较好吗?
1条答案
按热度按时间0pizxfdo1#
如果你正在尝试实现一种分页,你应该总是:
$match
根据您的参数过滤大多数文档1.执行
$sort
所需的任何操作(例如添加字段)$sort
与您想要的字段(这里为publishDate
)+_id
字段({$sort: {"publishDate": -1, id : -1 } },
)。_id部分对于保持结果的一致性很重要,因为2个文档对于publishDate
可以具有相同的值,但对于_id
不会具有相同的值$skip
现在您的文档已排序$limit
保持你想要的文档数量1.做额外的事情,如果你想在这里(投影等)
如果你在排序前
$skip
,你会跳过随机的文档,这会破坏你的结果。我在mongoplayground上做了一个简单的例子。在这个例子中,我想让所有的“lemons”按键排序,跳过一个,保留其余的。
$match
之前先使用$skip
,它将跳过第一个文档,这甚至不是一个柠檬-->错误选项$match
之后但在$sort
之前使用$skip
,它将跳过一个lemon,但可能不是我想要的那个,因为它还没有排序--> WRONG OPTION(如果您更改集合中文档的顺序,它将更改输出)$sort
之后使用$skip
,我将始终得到相同的结果--> GOOD OPTION