2011-12-10 4 views
0

Bonjour à tous les fans de MongoDB/Mongoid!Obtenir des données de deux collections mongoid

J'ai un petit problème avec la conception de mon schéma. J'ai actuellement trois modèles, User, Post et Comment. User <- has_many -> Posts, Post <- belongs_to -> User, Post <- has_many -> Comments et Comment <- belongs_to -> Post, User.

Maintenant, j'ai besoin de lister un flux avec tous les messages et commentaires, y compris l'objet Utilisateur. Pensez calendrier Twitter y compris les commentaires. Le commentaire doit contenir à la fois l'objet utilisateur de publication, de post-utilisateur et de commentaire associé.

Est-ce possible en utilisant Mongo & Mongoid ou dois-je modifier la conception de mon schéma? Si oui, des idées?

Thx, Tobias

+0

Si vous avez la 'Post', ne pouvez-vous obtenir juste l'utilisateur et des commentaires avec' @ post.user' et '@ post.comments'? – Russell

+0

Je dois créer la chronologie basée sur created_at. Post et les commentaires doivent être mélangés dans la liste – sandelius

Répondre

0

Voici ce que je ferais pour l'échelle correctement votre schéma; avec prévoir une structure de document plutôt simple. Je prendrais et contenir un seul poste dans un document qui a toutes les informations nécessaires dont vous avez besoin et faire quelque chose comme:

Messages Tableau:

{ 
    _id: mongoId, 
    author_name:'Tobias', 
    author_id: mongoId, 
    post_content: 'hi this is my post', 
    comments:[ 
     { 
      "comment":"this is a comment", 
      "user":"bob", 
      "user_id":mongoId 
     }, 

     { 
      "comment":"this is a comment2", 
      "user":"bob2", 
      "user_id":mongoId 
     } 
    ] 
    } 

Ensuite, tout simplement une table d'utilisateurs qui contient l'identifiant/nom et toute autre information que vous pourriez vouloir sur l'utilisateur. La raison pour laquelle j'ai choisi de dénormaliser le nom d'auteur/utilisateur est de faciliter la représentation de ces données dans votre couche de vue. Il est beaucoup plus facile d'écrire une fonction de réduction rapide de carte pour passer en revue et mettre à jour les noms dans la table des posts (travail final) puis devoir faire plusieurs requêtes pour aller chercher l'information. Avoir ce schéma intégré riche aidera à générer des pages rapides pour vous.

Juste comme je suis clair le author_name == user et author_id == user_id (juste schéma de nommage différent pour clarifier où il est principalement pour votre code de côté de l'application. Mais ceci est juste un exemple et vous pouvez modifier comme vous voyez s'adapter.

Bonne chance!

+0

Cela semble intéressant! Mais quand un utilisateur change son nom, j'ai besoin de les mettre à jour dans les commentaires intégrés.Vous parlez de "fonction de réduction de la carte". être un peu plus détaillé à ce sujet? Thel – sandelius

+0

Sandelius, notez également que vous feriez cela en mongoid en utilisant les macros embeds_many, embedded_in. Re: map/reduce, vous n'avez probablement pas besoin de le faire de cette façon, une simple requête de mise à jour sur la collection de poste suffira probablement. –

Questions connexes