5

我目前的聚合是:

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

对于以下文档结构:

{
  _id: '...',
  user_id: '...',
  group_id: '...',
  last_post_at: Date,
}

我也有一个索引{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

我想知道如何使它对一个非常大的 group_members 有性能并且仍然以正确的顺序返回它。

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

4

1 回答 1

5

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

但是,在您的查询中,与 group_members 集合的总大小相比,您似乎想要查询相对较少数量的 user_id。所以我只推荐一个关于 user_id 的索引。在这种情况下,MongoDB 将不得不按 last_post_at 对内存中的结果进行排序,但这是值得的,以换取使用 user_id 进行初始查找的索引。

于 2013-06-11T22:00:12.830 回答