2016-09-20 10 views
2

firebaseと角度で1対1のチャットアプリを構築しようとしています。私はfirebaseドキュメントで推奨されている構造を使用していますが、データの取得に問題があります。Firebaseの1対1のチャットアプリの構造と値で子を取得

{ 
    "chats" : { 
    "one" : { 
     "lastMessage" : "test" 
    } 
    }, 
    "members" : { 
    "one" : { 
     "rebel" : true, 
     "redboy" : true 
    } 
    }, 
    "messages" : { 
    "one" : { 
     "-KS1R6b-1TdVASQL4tj7" : { 
     "createdAt" : 1474288450158, 
     "text" : "hgagagagaga", 
     "userId" : "rebel" 
     }, 
     "-KS1aZxqX3_PpjNdyiA7" : { 
     "createdAt" : 1474291191857, 
     "text" : "hhh", 
     "userId" : "redboy" 
     } 
    } 
    } 
} 

firebaseクエリでユーザーの反乱のチャットを取得する方法を教えてください。または、ユーザーのルートにチャットを保存する必要があります。

この構造はWHERE句なしで私を混同

UPDATE:

私は、ユーザーのルートにchatIdsを追加した場合、これは私の問題を解決するためではなく、必ずそれが真実であるかどうか。正しい方法だと思われる

+0

あなたの質問にJSONツリーの画像が含まれています。 Firebaseデータベースコンソールの[エクスポート]ボタンをクリックすると、実際のJSONをテキストとして置き換えてください。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

@FrankvanPuffelen @FrankvanPuffelenあなたは私がそれを置き換えた – cgrgcn

答えて

2

Firebase(および他の多くのNoSQLソリューション)を使用する場合、アプリケーションが消費するデータをモデル化する必要があることがよくあります。

現在のデータ構造では、特定のチャットルームのメンバーを簡単に見つけることができます。

ref.child('members').orderByChild('rebel').equalTo(true) 

をしかし、これはあなたが追加する必要があると思いますので、(スケールしない各ユーザーのためのインデックスを定義する必要があります。

技術的に、あなたは、特定のメンバーのためにチャットルームを見つけるために照会することができます

{ 
    "rules": { 
    "members": { 
     ".indexOn": ["rebel", "redboy"] 
    } 
    } 
} 

最も一般的な解決策は、(以前のように)モデルに必要なクエリを許可することです。あなたは各ユーザーのチャットルームを見つけたいので、あなたは、各ユーザーのチャットルーム格納するモデルを展開する必要があります。見ての通り

"memberships" : { 
    "rebel" : { 
    "one": true 
    }, 
    "redboy" : { 
    "one" true 
    } 
}, 

を、ここではmembersインデックスを保持します。

は今、あなたは簡単で、ユーザー反逆者のための部屋を決定することができます。

ref.child('memberships/rebel').on('child_added', ... 

私はあなたの質問に類似した構造を追加することを参照してください。主な違いは、これをトップレベルの構造として追加したことです。これはFirebaseの一般的なパターンです。データを保護し、データのサブセットのみを取り出すことが容易になるためです。

この問題をより快適にするには、NoSQL data modelingでこの記事をお勧めします。

+0

ありがとうフランクこれは私にとって非常に良い答えです、私はあなたが提案するようにトップレベルに私を追加します – cgrgcn

+0

私はここで1つのフォローアップの質問がある@FrankvanPuffelen、ユーザーredboy反乱軍にメッセージを送る? Redboyはまず新しいチャットを作成し、そのチャットをメンバーシップ/反乱のノードとして追加しますか?これは正しいアプローチですか?このロジックはすべてクライアントアプリケーションに配置されますか? –

0

はいすべてのチャットに続いてメッセージを取得するには、チャットIDを値trueで保存する必要があります。これに従ってくださいlink

関連する問題