私の現在の集計は次のとおりです。
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 に対してパフォーマンスを向上させ、正しい順序で返す方法を考えています。
更新: メモリに読み込まれるドキュメントの数を制限するソリューションを見つけたいと思っています。これはかなり大きなコレクションになり、非常に頻繁にアクセスされます。