2011-12-10 8 views
0

こんにちはすべてのMongoDB /モンゴイファン!2つのコレクションmongoidからデータを取得

私のスキーマ設計には小さな問題があります。

現在のところ、私にはUser,PostCommentという3つのモデルがあります。 User <- has_many -> Posts,Post <- belongs_to -> User,Post <- has_many -> CommentsおよびComment <- belongs_to -> Post, User

これで、Userオブジェクトを含むすべての投稿とコメントを含むフィードをリストする必要があります。コメントを含むTwitterのタイムラインを考えてください。コメントには、関連する投稿、投稿ユーザ、およびコメントユーザオブジェクトの両方が読み込まれている必要があります。

Mongo & Mongoidを使用してこれを行うことはできますか、または私のスキーマ設計を変更する必要がありますか?もしそうなら、どんなアイディアですか?

Thx、Tobias

+0

あなたが 'POST'を持っている場合は、あなただけの' @のpost.user'と '@のpost.comments'でユーザーとコメントを得ることができない? – Russell

+0

私が作成する必要があります – sandelius

答えて

0

これは、スキーマを適切に拡大するために行うものです。かなり単純な文書構造を提供します。私が取ると、あなたが必要とするすべての必要な情報を持っているドキュメント内の単一のポストを含み、のようなものだろう:

投稿表を:

{ 
    _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 
     } 
    ] 
    } 

そして、単にID /名前を保持しているユーザーテーブルを持っていますユーザーに必要なその他の情報が含まれます。私がauthor_name/userを非正規化することを選択したのは、ビューレイヤーでこのデータを簡単に表現するためです。投稿テーブル(バックエンドの作業)の名前を調べたり更新したりして、情報を取得するために複数のクエリを実行する必要がある場合は、quick map reduce関数を書くほうがはるかに簡単です。この豊富な組み込みスキーマを使用すると、簡単なページを生成するのに役立ちます。

私はauthor_name == userとauthor_id == user_idをクリアしています(アプリのサイドコードがどこにあるのかを明確にするために、別の命名スキーマがありますが、これは一例にすぎず、フィット。

グッドラック!

+0

これは面白そうですが、ユーザーが自分の名前を変更したときに、埋め込まれたコメントでそれらを更新する必要があります。少しだそれについてもっと詳しく? Thx – sandelius

+0

Sandeliusも、embeds_many、embedded_inマクロを使用してmongoidでこれを行うことに注意してください。 Re:map/reduce、あなたはおそらくそうする必要はありません。ポストコレクションの簡単な更新クエリで十分でしょう。 –

関連する問題