Как получить несколько ключей в 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 лучший способ решить эту проблему?
Ответы
Ответ 1
Это подходящий способ вызова нескольких ключей на одной конечной точке в 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(...)
}
Другим способом может быть использование Firebase функций для моментальных снимков данных, например forEach
snapshot.forEach(function(childSnapshot) {
groupRef.child(childSnapshot.key).once(...)
})
Ответ 2
Да, вы идете правильно. Как написано в этом вопросе, firebase будет конвейерно запрограммировать ваши запросы, и вам не придется беспокоиться о производительности и времени в оба конца. Как только начнется ваша итерация, вы получите данные о бомбе. Поэтому имейте в виду, чтобы правильно обрабатывать его в вашем ui.
Другой вариант, который будет зависеть от того, насколько большие ваши данные /groups
будут расти, заключается в том, чтобы сохранить моментальный снимок (может быть $firebaseObject
, если вы используете angularfire) всей ветки /groups
, которая будет обновляться всякий раз, когда данные изменения. Затем вам просто нужно отследить этот снимок. Но опять же, если вы планируете играть с большим количеством групп, ваше текущее решение - лучший выбор.
Кроме того, я рекомендую вам позаботиться о настройке события on
для каждой группы, которую вы извлекаете. Имейте в виду, что обратный вызов будет срабатывать при каждом изменении данных (зависит от установленного события). В зависимости от вашего варианта использования вы должны использовать .once("value"
, поскольку он будет запускать данные только один раз, делая его более надежным, более эффективным и избежит обработки обратных вызовов, когда вы их не ожидаете.