如何使用匹配,排序和限制来订购MongoDB聚合

Tal*_*Tal 5 mongodb aggregation-framework

我当前的汇总是:

db.group_members.aggregate({
  $match: { user_id: { $in: [1,2,3] } }
}, {
  $group: { _id: "$group_id" }
}, {
  $sort: { last_post_at: -1 }
}, {
  $limit: 5
})
Run Code Online (Sandbox Code Playgroud)

对于以下文档结构:

{
  _id: '...',
  user_id: '...',
  group_id: '...',
  last_post_at: Date,
}
Run Code Online (Sandbox Code Playgroud)

我也有一个索引 {user_id: 1, last_post_at: -1}

由于我的索引已经打开last_post_at,因此排序没有用吗?我不确定100%如何订购。

我的最终目标是复制此SQL:

SELECT DISTINCT ON (group_id)
FROM group_members
WHERE user_id in [1,2,3]
ORDER_BY last_post_at DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)

我想知道如何使它在非常大的group_members中表现出色,并且仍然以正确的顺序返回它。

更新:我希望找到一种解决方案,以限制加载到内存中的文档数量。这将是一个相当大的集合,并且访问非常频繁。

A. *_*vis 5

将$ sort放在$ group之前,否则MongoDB无法使用索引来帮助进行排序。

但是,与group_members集合的总大小相比,在查询中看起来您想要查询的user_id数量相对较少。因此,我建议仅在user_id上建立索引。在这种情况下,MongoDB必须按last_post_at对您的结果进行排序,但这值得以使用user_id的初始查找索引来交换。