2010-10-01 6 views
9

Ce que je dois:Faire un calendrier semblable à Twitter avec MongoDB

Supposons que vous utilisez MongoDB et vous avez une collection appelée users, et chaque utilisateur dispose d'un tableau « suivant » avec l'utilisateur _id s de la les gens qu'il suit. Ensuite, vous avez une autre collection statuses, avec chaque statut contenant le _id de son auteur. Comment afficher à un utilisateur particulier tous les statuts ajoutés par les personnes qu'il suit?

Ce que j'ai essayé:

Je mets tous les utilisateurs _id s que l'utilisateur actuel suit dans un tableau (j'utilise PHP), puis je l'ai utilisé pour trouver tous les statuts par les utilisateurs en utilisant $in.

La question:

Est-ce la meilleure solution?

Répondre

3

Je ne vois pas d'autre moyen aussi, j'ai mis en œuvre une telle chose avant et n'a pas eu de problème.

Sur votre cas, il devrait être STH comme celui-ci, vous passez certaine gamme de $follower_ids utilisateur comme argument à votre fonction:

$query = array("status_owner_id" => array('$in' => $follower_ids)); 
$cursor = $mongo->yourdb->statuses->find($query); 

Et si vous statuts d'index (si vous avez suffisamment de RAM pour le faire) sur owner_id vous obtiendrez les résultats très rapidement.

Espérons que ça aide, Sinan.

0

Qu'est-ce que vous avez essayé est ce que tout le monde pense d'abord mais il est pas vraiment facile à l'échelle ... Vous pouvez toujours ajouter d'autres serveurs ou utiliser sharding etc ... Si vous avez des millions d'utilisateurs et des personnes qui suivent beaucoup de gens cette solution deviendrait vraiment difficile à exécuter.

Il existe une autre solution qui consiste simplement à effectuer l'agrégation lorsque quelqu'un publie un statut. Facebook utilise cette idée et il pourrait être plus facile de la mettre à l'échelle et si quelqu'un suit 25000 personnes, il verra sa liste de statut assez rapidement et votre serveur n'aura pas à "se battre" pour récupérer les données rapidement. Vous aurez une collection d'utilisateurs, chaque utilisateur aura un tableau de statuts. Disons que vous avez user1 et user2, et que user1 suit user2. Lorsque l'utilisateur2 envoie un statut, son statut sera sauvegardé dans le tableau de statuts user1 et dans le tableau de statuts user2. Vous utiliserez plus de stockage qui avec mongoDB signifie plus de mémoire .... Chez Facebook ils utilisent Hadoop avec HBase pour le stockage principal puis ils ont d'énormes baies de serveurs avec beaucoup de mémoire. Un inconvénient est que si vous supprimez un statut, vous devez le supprimer partout ... Avantage majeur de cette solution, chaque utilisateur disposera d'un tableau de statuts déjà en ordre! Dans la solution précédente si vous suivez 3users, vous devez saisir tous leurs flux puis les trier, puis les rendre ...

[Modifier] Comme Shekhar l'indique dans le commentaire, Mongo a un document Limite.Vous devez créer une collection de statuts et sauvegarder le statut deux fois, une fois pour user2 et une fois pour user1 et avoir besoin d'un fromId, toId, status et time

+0

Étant donné que la taille du document dans MongoDB ne peut pas être supérieure à 16 Mo . Ne seriez-vous pas à la limite et finalement vous devez créer une nouvelle collection? – Shekhar

+0

Oui en effet c'est mon exemple de Facebook qui utilise HBase, pour MongoDb vous pouvez créer une collection de status, quand user2 pousse l'état que vous enregistrez deux fois, une fois pour user2 et une seconde fois pour user1, votre document status contient un fromId , un toId, le temps et le statut lui-même ... – zzarbi

Questions connexes