web-dev-qa-db-ja.com

Firebaseで複数のキーを取得する方法は?

このデータ構造を考慮して:

{
    "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はこの問題を解決するより良い方法を提供しますか?

22
Pier

これは、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(...)
})
18
Devid Farinelli

はい、あなたは正しい方法で進んでいます。 この質問 で書かれているように、firebaseはリクエストをパイプライン化するので、パフォーマンスと往復時間を気にする必要はありません。反復が開始されるとすぐに、Firebaseデータを受け取ります。したがって、UIで適切に処理するように注意してください。

もう1つのオプションは、/groupsデータは増加しますが、スナップショットを保持します($firebaseObject(anglefireを使用している場合)全体/groupsデータが変更されるたびに更新されるブランチ。次に、このスナップショットを追跡する必要があります。繰り返しになりますが、大量のグループでプレイすることを計画している場合、現在のソリューションの方が適しています。

また、取得するグループごとにonイベントを設定することをお勧めします。データが変更されると必ずコールバックがトリガーされることに注意してください(設定されたイベントに依存します)。ユースケースに応じて、.once("value"は、データを1回だけトリガーし、信頼性とパフォーマンスを向上させ、予期しないコールバックの処理を回避するためです。

6
adolfosrs