Toto je problém fan-in vs. fan-out. Navrhoval bych, abyste zkusili fan-out:
Udržujte feed
kolekce pro vaše uživatele. Když uživatel nahraje dokument, vložte novou položku zdroje do každé kolekce položek zdroje jeho přátel. Sbírka může vypadat takto:
{
"_id": (some id)
"UserId": (id of the user who 'owns', i.e. reads this feed)
"FriendId": (if of the friend who posted the file)
"FriendName": "John Doe" (name of the fried, denormalized)
"Timestamp": ...
}
Použijte složený index {UserId, Timestamp}
.
Tento přístup je náročný na psaní:Pokud má Jane stovky přátel, tyto stovky příloh zaberou čas. Na druhou stranu nahrání souboru obecně tak jako tak zabere spoustu času, takže režie je zanedbatelná a vaše čtení bude směšně jednoduché.
Samozřejmě to lze dále optimalizovat s větším úsilím, ale mělo by to fungovat dobře pro poměrně malý provoz.