我正在尝试建立复杂的聚合管道,该管道将从集合中获取项目并对其进行多次排序。
我需要做的是: 1)从集合中获取所有用户 2)按用户选择的值对它们进行排序(例如,按他们留下的评论数量) 3)按角色(管理员,主持人,基本用户)对其进行排序
即使一些基本用户有更多评论,想法还是要首先显示管理员用户,但是如果我们有2位管理员,他们也会被排序。
请注意,当未按恒定顺序获取项目时,第一个$ sort是为了避免意外的sort + limit行为。在构建管道时,将根据API请求中传递的页数来计算$ skip的值。
现在我有这样的东西:
[
{ $match: <some condition> },
{ $sort: { _id: 1 } },
{ $sort: { countOfComment: -1 } },
{ $sort: { isAdmin: -1, isModerator: -1 } },
{ $skip: <page * 10> },
{ $limit: 10 }
]
如果我做对了-应该: 1)按ID对所有用户进行排序,因此在不同页面中不会出现重复项。这需要独特的领域来工作 2)按评论数量排序 3)按用户角色排序。这是为了保存以前的排序结果,所以
- user with 4 comments
- moderator with 0 comments
- admin with 3 comments
- user with 2 comments
- admin with 1 comment
将成为
- admin with 3 comments
- admin with 1 comment
- moderator with 0 comments
- user with 4 comments
- user with 2 comments
但事实并非如此。看起来每个下一个$ sort语句都会丢失前一个的结果。有什么想法可以达到预期的行为吗?
答案 0 :(得分:1)
您只需要一个排序阶段,即
$sort: {
isAdmin: -1,
isModerator: -1,
countOfComment: -1
}
基本上,由于您首先按countOfComment进行了排序,因此,将优先考虑按countOfComment进行排序。因此,无论如何,countOfComment字段肯定会以降序排序,然后才看到下一个要排序的字段。同样,排序时最后一个字段的优先级最低。
放置排序项的顺序是优先顺序。
答案 1 :(得分:1)
您可以将排序合并到一个对象中,例如:-
{ $sort: { countOfComment: 1, isAdmin: -1, isModerator: -1 } }
您可以使用$group删除重复的记录,然后使用项目,然后再使用排序