Questo è il problema tra fan-in e fan-out. Ti suggerirei di provare il fan-out:
Conserva un feed
raccolta per i tuoi utenti. Quando un utente carica un documento, inserisci un nuovo elemento del feed in ciascuna delle raccolte di elementi del feed dei suoi amici. La collezione potrebbe assomigliare a questa:
{
"_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": ...
}
Utilizza un indice composto {UserId, Timestamp}
.
Questo approccio è pesante per la scrittura:se Jane ha centinaia di amici, queste centinaia di inserti richiederanno il loro tempo. D'altra parte, il caricamento di un file generalmente richiede comunque molto tempo, quindi l'overhead è trascurabile e le tue letture saranno ridicolmente semplici.
Naturalmente, questo può essere ulteriormente ottimizzato con uno sforzo maggiore, ma dovrebbe andare bene per un bel po' di traffico.