ti-enxame.com

Como recuperar várias chaves no Firebase?

Considerando esta estrutura de dados:

{
    "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"
        },
    }
}

Eu poderia obter os grupos de um usuário específico com:

firebase.database().ref('users/user-1/groups').on(...)

O que me daria esse objeto:

{
    "group-key-1":true,
    "group-key-3":true
}

Então agora eu quero recuperar as informações para esses grupos.

Meu instinto inicial seria repetir essas chaves e fazer o seguinte:

var data = snapshot.val()
var keys = Object.keys(data)

for (var i = 0; i < keys.length; i++) {
    firebase.database().ref('groups/' + keys[i]).on(...)
}

Essa é a maneira apropriada de chamar várias chaves no mesmo terminal no Firebase?

O Firebase fornece uma maneira melhor de resolver esse problema?

22
Pier

Essa é a maneira apropriada de chamar várias chaves no mesmo terminal no Firebase?

Sim, geralmente essa é uma boa solução para recuperar todos os grupos dessa maneira.

O Firebase fornece uma maneira melhor de resolver esse problema?

Eu não acho que o Firebase fornece qualquer outra função/consulta que possa ajudar nesse caso.

De qualquer forma, isso poderia ser melhorado, salvando a ref em uma variável e fazendo um loop nas chaves do objeto diretamente. Além disso, se você precisar recuperar esses dados apenas uma vez, use once() em vez de on()

var groupRef =  firebase.database().ref('groups/')
var data = snapshot.val()

for (var groupID in data) {
    groupRef.child(data[groupID]).once(...)
}

Outra maneira poderia ser usar o funções do Firebase para os instantâneos de dados, como forEach

snapshot.forEach(function(childSnapshot) {
      groupRef.child(childSnapshot.key).once(...)
})
18
Devid Farinelli

Sim, você está indo no caminho certo. Conforme escrito em esta pergunta firebase encaminhará suas solicitações e você não precisará se preocupar com desempenho e tempo de ida e volta. Assim que sua iteração iniciar, você receberá dados do firebase. Portanto, lembre-se de lidar com isso adequadamente em sua interface do usuário.

Outra opção, que depende do tamanho dos dados de /groups, É manter um instantâneo (pode ser um $firebaseObject Se você estiver usando o angularfire) de todo o /groups ramo que será atualizado sempre que os dados forem alterados. Então você só precisa acompanhar esse instantâneo. Mas novamente, se você planeja jogar com uma grande quantidade de grupos, sua solução atual é uma escolha melhor.

Além disso, recomendo que você defina um evento on para cada grupo que recuperar. Lembre-se de que o retorno de chamada será acionado sempre que os dados forem alterados (depende do evento configurado). Dependendo do seu caso de uso, considere usar .once("value", Pois ele acionará os dados apenas uma vez, tornando-os mais confiáveis, mais performáticos e evitará o tratamento de retornos de chamada quando você não os espera.

6
adolfosrs