Подтвердить что ты не робот

Как получить несколько ключей в 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 лучший способ решить эту проблему?

4b9b3361

Ответ 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", поскольку он будет запускать данные только один раз, делая его более надежным, более эффективным и избежит обработки обратных вызовов, когда вы их не ожидаете.