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_ids をクエリしたいようです。したがって、user_id のみのインデックスをお勧めします。その場合、MongoDB はメモリ内の結果を last_post_at でソートする必要がありますが、user_id による最初のルックアップにインデックスを使用する代わりに、これは価値があります。

于 2013-06-11T22:00:12.830 に答える