To jest problem rozproszenia i rozproszenia. Proponuję wypróbować fan-out:
Zachowaj feed
kolekcja dla Twoich użytkowników. Gdy użytkownik prześle dokument, wstaw nowy element kanału do każdej kolekcji elementów kanału jej znajomych. Kolekcja może wyglądać tak:
{
"_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": ...
}
Użyj indeksu złożonego {UserId, Timestamp}
.
Takie podejście jest trudne do pisania:jeśli Jane ma setki przyjaciół, te setki wstawek zajmą im czas. Z drugiej strony przesłanie pliku i tak zajmuje zazwyczaj dużo czasu, więc obciążenie jest znikome, a odczyty będą śmiesznie proste.
Oczywiście można to dalszą optymalizację z większym wysiłkiem, ale powinno wystarczyć przy sporym natężeniu ruchu.