Was ich brauche:
Angenommen, Sie verwenden MongoDB, und Sie haben eine Sammlung mit dem Namen users
, und jeder Benutzer hat ein Array "following" mit dem Benutzer _id
s der Personen, denen er folgt. Dann haben Sie eine andere Sammlung statuses
, wobei jeder Status den _id
seines Autors enthält.
Wie können Sie einem bestimmten Benutzer alle Status anzeigen, die von Personen hinzugefügt wurden, denen er folgt?
Was ich versucht habe:
Ich habe alle Benutzer _id
s eingetragen, denen der aktuelle Benutzer in einem Array folgt (ich benutze PHP), dann habe ich ihn benutzt, um alle Status dieser Benutzer zu finden, die $in
benutzen.
Die Frage:
Ist das die beste Lösung?
Ich kann auch keinen anderen Weg sehen, ich habe so etwas vorher implementiert und hatte kein Problem.
In Ihrem Fall sollte es so sein, dass Sie das $follower_ids
-Array eines bestimmten Benutzers als Argument für Ihre Funktion übergeben:
Und wenn Sie Status indexieren (wenn Sie genug RAM dafür haben) auf owner_id, erhalten Sie die Ergebnisse wirklich schnell.
Ich hoffe, es hilft, Sinan.
Was Sie probiert haben, ist, was jeder Körper zuerst denkt, aber es ist nicht wirklich einfach zu skalieren ... Sie können immer mehr Server hinzufügen oder Sharding usw. verwenden ... Wenn Sie Millionen von Benutzern und Leuten haben, die vielen Leuten folgen, würde diese Lösung sehr schwierig werden.
Es gibt eine andere Lösung, die im Grunde nur die Aggregation durchführt, wenn jemand einen Status postet. Facebook verwendet diese Idee und es könnte einfacher zu skalieren sein und wenn jemand 25000 Menschen verfolgt, wird er seine Statusliste ziemlich schnell sehen und der Server muss nicht "kämpfen", um die Daten schnell zu finden.
Sie werden eine Benutzersammlung haben, jeder Benutzer wird ein Status-Array haben. Nehmen wir an, Sie haben user1 und user2, und dieser user1 folgt user2. Wenn Benutzer2 einen Status drückt, wird sein Status in user1-Array von Status UND in user2-Array von Status gespeichert. Sie werden mehr Speicher verwenden, was mit mongoDB mehr Speicher bedeutet ... Auf Facebook verwenden sie Hadoop mit HBase für den Hauptspeicher, dann haben sie riesige Arrays von Servern mit viel Speicher.
Ein Nachteil ist, wenn Sie einen Status löschen, müssen Sie ihn überall löschen ... Ein großer Vorteil dieser Lösung ist, dass jeder Benutzer eine Reihe von Status hat, die bereits in Ordnung sind! In der vorherigen Lösung, wenn Sie 3users folgen, müssen Sie alle ihre Feeds greifen dann sortieren sie und dann rendern sie ...
[Bearbeiten] Wie Shekhar auf den Kommentar hingewiesen hat, hat Mongo ein Dokument Limit. Sie müssen eine Statusauflistung erstellen und den Status zweimal speichern, einmal für Benutzer2 und einmal für Benutzer1, und Sie müssen über eine ID, eine ID, einen Status und eine Uhrzeit verfügen
Tags und Links mongodb database-design