Dies ist das Fan-In vs. Fan-Out-Problem. Ich würde vorschlagen, dass Sie Fan-out versuchen:
Halten Sie einen feed
Sammlung für Ihre Benutzer. Wenn ein Benutzer ein Dokument hochlädt, fügen Sie einen neuen Feed-Eintrag in die Feed-Eintrags-Sammlung seiner Freunde ein. Die Sammlung könnte so aussehen:
{
"_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": ...
}
Verwenden Sie einen zusammengesetzten Index {UserId, Timestamp}
.
Dieser Ansatz ist schreiblastig:Wenn Jane Hunderte von Freunden hat, werden diese Hunderte von Einfügungen ihre Zeit in Anspruch nehmen. Andererseits nimmt das Hochladen einer Datei im Allgemeinen sowieso viel Zeit in Anspruch, sodass der Overhead vernachlässigbar ist und Ihre Lesevorgänge lächerlich einfach sind.
Dies kann natürlich weiter optimiert werden mit mehr Aufwand, aber es sollte für ziemlich viel Verkehr gut ausreichen.