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

时间:2013-06-11 20:36:51

标签: 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
})

对于以下文档结构:

{
  _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表现出来,并且仍然按照正确的顺序返回它。

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

1 个答案:

答案 0 :(得分:4)

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

但是,在您的查询中,您似乎希望查询与group_members集合的总大小相比较少的user_id。所以我建议仅在user_id上使用索引。在这种情况下,MongoDB必须通过last_post_at在内存中对结果进行排序,但这对于使用user_id进行初始查找的索引来说是值得的。