Mongo Aggregation多个排序阶段(nodejs)

时间:2019-01-23 07:14:32

标签: node.js mongodb aggregation-framework

我正在尝试建立复杂的聚合管道,该管道将从集合中获取项目并对其进行多次排序。

我需要做的是: 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语句都会丢失前一个的结果。有什么想法可以达到预期的行为吗?

2 个答案:

答案 0 :(得分:1)

您只需要一个排序阶段,即

    $sort: {
      isAdmin: -1,
      isModerator: -1,
      countOfComment: -1
    }

基本上,由于您首先按countOfComment进行了排序,因此,将优先考虑按countOfComment进行排序。因此,无论如何,countOfComment字段肯定会以降序排序,然后才看到下一个要排序的字段。同样,排序时最后一个字段的优先级最低。

放置排序项的顺序是优先顺序。

答案 1 :(得分:1)

您可以将排序合并到一个对象中,例如:-

{ $sort: { countOfComment: 1, isAdmin: -1, isModerator: -1 } }

您可以使用$group删除重复的记录,然后使用项目,然后再使用排序