1

ノードjsでfirebaseを使用しています。

以下は私のデータモデルです

"sList" : {
    "-K_KxnexiRMvC81bTEVH" : {
          "description" : "sdf",
          "name" : "sdf",
          "users" : [ "-K_Kxnf9XBnClTgFv67z", "-K_KvlWOiNCOBDL-Vl3y" ]
        },
    "-K_KxnexiRMvC81asdabTEVHas" : {
          "description" : "sdf",
          "name" : "pdsff",
          "users" : [ "-K_Kxnf9XBnClTgasv67z", "-K_KvlWOiNCsadOBDL-Vl3y" ]
        },
}

一意の ID が各ドキュメントの users 配列に追加されます。

一意の ID が追加されるたびに、各ドキュメントのすべてのユーザー配列にイベント リスナーを追加するにはどうすればよいですか?

以下のコードを試しましたが、動作しません

var listRef = firebaseAdmin.database().ref('/sList');

listRef.on('child_changed', function(dataSnapshot) { 
    const msg= dataSnapshot.val();
    const key= dataSnapshot.key();
    var userRef = listRef.child();
    userRef.on('child_changed', function(childDataSnapshot) {
        const val=childDataSnapshot.val();
     });
})
4

1 に答える 1

0

Firebase の次の 2 つの推奨事項に違反しています。

  1. データをネストしない
  2. 配列にデータを格納しない

データを入れ子にしない

ほとんどの場合、ここでネストに悩まされています。sList のユーザーだけをリッスンしたい場合は、そのデータを個別に保存する必要があります。幸いなことに、これは簡単に修正できます。

"sList" : {
    "-K_KxnexiRMvC81bTEVH" : {
          "description" : "sdf",
          "name" : "sdf",
        },
    "-K_KxnexiRMvC81asdabTEVHas" : {
          "description" : "sdf",
          "name" : "pdsff",
        },
},
"sListUsers": {
    "-K_KxnexiRMvC81bTEVH" : [ "-K_Kxnf9XBnClTgFv67z", "-K_KvlWOiNCOBDL-Vl3y" ],
    "-K_KxnexiRMvC81asdabTEVHas" : [ "-K_Kxnf9XBnClTgasv67z", "-K_KvlWOiNCsadOBDL-Vl3y" ]
}

そのため、同じキーを持つ2 つのリストを保持します。これにより、ユーザーまたはsList のメタデータを検索できます。

ユーザーのリッスンは、次のような単純な問題になります。

var listRef = firebaseAdmin.database().ref('/sListUsers/-K_KxnexiRMvC81bTEVH');

listRef.on('child_added', function(dataSnapshot) { 
    const user = dataSnapshot.val();
})

データを配列として保存しない

2 番目の問題は、ユーザーを配列に格納していることです。つまり、一意でない値の順序付けられたコレクションです。しかし、あなたが持っているものを見ると、一意の値の (場合によっては順序付けられていない) コレクションにユーザーを格納したい可能性が高くなります。このようなコレクション型は通常、セットと呼ばれます。

Firebase では、一連のユーザーは次のようにモデル化されます。

データモードに適用すると、次のようになります。

"sList" : {
    "-K_KxnexiRMvC81bTEVH" : {
          "description" : "sdf",
          "name" : "sdf",
        },
    "-K_KxnexiRMvC81asdabTEVHas" : {
          "description" : "sdf",
          "name" : "pdsff",
        },
},
"sListUsers": {
    "-K_KxnexiRMvC81bTEVH" : { 
        "-K_Kxnf9XBnClTgFv67z": true, 
        "-K_KvlWOiNCOBDL-Vl3y": true
    },
    "-K_KxnexiRMvC81asdabTEVHas" : {
        "-K_Kxnf9XBnClTgasv67z": true, 
        "-K_KvlWOiNCsadOBDL-Vl3y": true
    }
}

Firebase は値なしでキーを保存できないため、ここtrueでは単なるマーカー値です。重要なことは、一意であることが保証されているキーとしてユーザーの ID を保存していることです。

ここからユーザーを取得するには、次のようにします。

var listRef = firebaseAdmin.database().ref('/sListUsers/-K_KxnexiRMvC81bTEVH');

listRef.on('child_added', function(dataSnapshot) { 
    const user = dataSnapshot.key;
})
于 2016-12-31T18:27:32.477 に答える