2017-06-08 14 views
0

私は特定のリクエストを作成するロジックをどこからでも探してきましたが、私はFirebaseの考え方を完全には理解していません。これは私のデータ構造である:私の最初のオプションは、ユーザIDに関するデータを取得する要求になりFirebase - idに基づくスナップショット

`users:{ 
    u1_id:{...} 
    u2_id:{...} 
    ... 
}, 
contacts:{ 
    u1_id:{ 
    contact1_id, 
    contact2_id, 
    ... 
    } 
}` 

、二番目の(実際のもの)は、彼らが「ときの連絡先から、私は必要なデータを格納することです再追加されましたが、各ユーザーの連絡先ごとに大きな更新プログラムを実行する必要があり、それは適切なソリューションではないようです。

を(私が質問、firebaseドキュメントやビデオをチェックしてきました)私が見つけた最も近いソリューションは、この(自分のユーチューブから)です:

function getUserContacts(key, cb){ 
    const rootRef = firebase.database().ref() 
    const contactsRef = rootRef.child('contacts') 
    const usersRef = rootRef.child('users') 

    contactsRef.child(key).on('child_added', snap => { 
    let userRef = usersRef.child(snap.key) 
    userRef.once('value', cb) 
    }) 

} 

それがすべてと対象物1によりユーザーに1を与えず私のユーザー

編集:私の一時的な解決策 - >

firebase.database().ref('users') 
    .on('value', snaps => { 
     firebase.database().ref(`contacts/${currentUser.uid}`) 
     .on('value', snapshot => { 
     let userContacts = [] 
     snapshot.forEach(snapc => { 
      snaps.forEach(snapu => { 
      let duser = snapu 
      if(snapc.key == snapu.key) 
      { 
       userContacts.push(snapu.val()) 
      } 
      }) 
     }) 
     dispatch({ 
      type: CONTACTS_FETCH, 
      payload: userContacts 
     }) 
     }) 
    }) 
+0

これは、少なくともかなり漠然と問題であり、私には、不明で何尋ねている。最初に、ユーザーIDに関するデータを取得する必要があります。どういう意味ですか? users/user_id_xノードからデータを取得しますか? 2番目の項目は*大きな更新*と言います。それは何ですか、あなたはそれを大きく更新していますか? – Jay

+0

あなたの答えをありがとう。連絡先ツリーには、ユーザーの連絡先リストに追加されたユーザーのIDのみが格納されます。私が望むのは、これらのユーザーの詳細を連絡先リストに表示することだけです。更新の問題は、各連絡先のIDではなくデータを保存する場合です。たとえば、ユーザーの変更がニックネームの場合、この連絡先を持つ各ユーザーのすべての発生を更新する必要があります。 – Sai

+0

それはまだ不明です。リストに連絡先情報を入力しますか?言い換えれば、連絡先のIDを読んで、リストを繰り返し、各連絡先を読み込みますか? – Jay

答えて

0

質問はまだ少し不明であるが、私は存在せて3つのオプション:

user_1の連絡先をリストに入れる場合は、ユーザーの連絡先ノードを値で読み取ります。この場合、user_1には2つの連絡先があります。 user_id2およびuser_id3

contacts 
    user_1 
    user_id2: true 
    user_id3: true 

値は、すべての子データでも親ノード(user_1)で読み取られます。データのノード全体(スナップショット)があるので、各user_idx(各子ノードのキー)を取得するために、user_1の子値を反復処理できます。子プロセスを繰り返すごとに、それぞれのキーが表示され、その特定のユーザーノードで読み取ることができます。

第2の選択肢は、構造を変更することです。このような構造を持つ

contacts 
    user_2 
    name: "John" 
    rank: "Captain" 
    contact_of: "user_1" 
    user_3 
    name: "William" 
    rank: "Second Officer" 
    contact_of: "user_1" 

、利用者1が自分の連絡先、連絡先のノードcontact_of =「USER_1」の単純なクエリをロードしたい場合。それは、各連絡先とそのすべてのデータをロードします。

この2番目の例は、ユーザーに特定の連絡先が共有されていない場合に機能します。

複数のユーザーが複数の連絡先を持つことができる場合は、別のオプションがあります。 USER_2とUSER_3を提示する

この場合
contacts 
    user_2 
    name: "Jean Luc" 
    rank: "Captain" 
    contact_of 
     user_1: true 
     user_2: true 
    user_3 
    name: "William" 
    rank: "Second Officer" 
    contact_of: 
     user_1: true 
     user_2: true 

、contact_of/USER_1 =真の連絡先ノードでdeep queryを実行して、/

+0

3つ目のオプションのようなものです。複数のユーザーで複数の連絡先を持つことができます。連絡先は他のユーザーのいずれかになることができます。私はすでに深いクエリを読んだことがありますが、それは私には明らかではありませんでした。私の問題は、今の場合、ユーザーの連絡先リストに関する最新の情報を入手することでした。 – Sai

+0

@Sai標準クエリでは、あるレベルのクエリが可能です。 3番目の例では、user_x/nameまたはuser_x/rankノードでクエリを実行できます。ディープクエリーではクエリーが一層深くなり、user_x/contact_ofでクエリーを実行できます。したがって、user_x/contact_of/user_1:trueのようなクエリが可能です。ディープクエリーは強力で、通常は正規化されていないデータにアクセスします。あなたは連絡先ノードにオブザーバーを付けることができ、連絡先が更新されると、あなたのアプリに最新の情報が通知されます。私の答えが助けてくれたら、それを受け入れて他人を助けることができるようにしてください。 – Jay

+0

今、私はそれを得る、おかげであなたの時間のために多くの – Sai

関連する問題