我現在的聚集是:如何與賽場秩序MongoDB的聚集,排序,並限制
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,仍然以正確的順序返回。
更新: 我希望找到一個解決方案,將限制文件加載到內存中的數量。這將是一個相當大的收集和訪問非常頻繁。
你缺少$ group階段的分組操作 - 你想要last_post:{$ max:「$ last_post_at」}或類似的東西。 –
那還是不需要將user_id:{$ in:[1,2,3]}的整個子集存儲在內存中嗎? – Tal
該小組必須通過所有匹配的文檔 - 因爲您的排序和限制是基於*聚合*值,因此它不能在組之前進行限制。可以想象,優化是可能的,將排序和限制每個user_id值在組之前,但目前沒有在2.4 MongoDB中實現。 –