このデータ構造を考慮して:
{
"users":{
"user-1":{
"groups":{
"group-key-1":true,
"group-key-3":true
}
}
},
"groups":{
"group-key-1":{
"name":"My group 1"
},
"group-key-2":{
"name":"My group 2"
},
"group-key-3":{
"name":"My group 3"
},
"group-key-4":{
"name":"My group 4"
},
}
}
特定のユーザーのグループを取得できます:
firebase.database().ref('users/user-1/groups').on(...)
これは私にこのオブジェクトを与えます:
{
"group-key-1":true,
"group-key-3":true
}
そこで、これらのグループの情報を取得したいと思います。
私の最初の本能は、これらのキーをループしてこれを行うことです。
var data = snapshot.val()
var keys = Object.keys(data)
for (var i = 0; i < keys.length; i++) {
firebase.database().ref('groups/' + keys[i]).on(...)
}
これは、Firebaseの同じエンドポイントで複数のキーを呼び出す適切な方法ですか?
Firebaseはこの問題を解決するより良い方法を提供しますか?
これは、Firebaseの同じエンドポイントで複数のキーを呼び出す適切な方法ですか?
はい、通常、これはすべてのグループをこの方法で取得するための優れたソリューションです。
Firebaseはこの問題を解決するより良い方法を提供しますか?
Firebaseがこの場合に役立つ他の関数/クエリを提供するとは思わない。
とにかく、これは、refを変数に保存し、オブジェクトのキーを直接ループすることで改善できます。また、これらのデータを一度だけ取得する必要がある場合は、once()
の代わりにon()
を使用する必要があります
var groupRef = firebase.database().ref('groups/')
var data = snapshot.val()
for (var groupID in data) {
groupRef.child(data[groupID]).once(...)
}
別の方法は、forEachのように、データのスナップショットにFirebaseの functions を使用することです
snapshot.forEach(function(childSnapshot) {
groupRef.child(childSnapshot.key).once(...)
})
はい、あなたは正しい方法で進んでいます。 この質問 で書かれているように、firebaseはリクエストをパイプライン化するので、パフォーマンスと往復時間を気にする必要はありません。反復が開始されるとすぐに、Firebaseデータを受け取ります。したがって、UIで適切に処理するように注意してください。
もう1つのオプションは、/groups
データは増加しますが、スナップショットを保持します($firebaseObject
(anglefireを使用している場合)全体/groups
データが変更されるたびに更新されるブランチ。次に、このスナップショットを追跡する必要があります。繰り返しになりますが、大量のグループでプレイすることを計画している場合、現在のソリューションの方が適しています。
また、取得するグループごとにon
イベントを設定することをお勧めします。データが変更されると必ずコールバックがトリガーされることに注意してください(設定されたイベントに依存します)。ユースケースに応じて、.once("value"
は、データを1回だけトリガーし、信頼性とパフォーマンスを向上させ、予期しないコールバックの処理を回避するためです。