#javascript #firebase #firebase-realtime-database
#javascript #firebase #firebase-realtime-database
Вопрос:
var database = firebase.database(); //db is empty.
function handler(e, prevChildKey) {
console.log(e.val());
}
database.ref('user').orderByChild('color').startAt('a').on('value', handler);
database.ref('user').set({
'ryan': {color: "a"},
'john': {color: "b"},
'kirsty': {color: "c"},
});
Я ожидаю: {ryan: {color: "a"}}
для входа в консоль. Причина в том, что я думал startAt
, что совпадают ключи, значение которых начинается с "a"
.
Вместо этого он регистрирует:
{
john: {color: "b"},
kirsty: {color: "c"},
ryan: {color: "a"}
}
Ответ №1:
Запрос в Firebase состоит из двух шагов:
- Вы указываете, по какому значению каждого дочернего узла упорядочивать, в вашем случае это значение
color
. Firebase считывает узлы и упорядочивает их по этому значению. - Затем вы указываете, с чего начать возвращать результаты, то есть дочерний
a
элемент. Поскольку вы не указываете конечное условие, Firebase возвращает все дочерние узлы с того, с которого он начинается.
Если вы хотите реализовать операцию starts with, вам нужно объединить startAt()
с endAt()
:
database.ref('user').orderByChild('color').startAt('a').endAt('auf8ff').on('value', handler);
uf8ff
В этом примере это просто символ, который находится достаточно далеко в конце набора символов, чтобы результат включал все узлы, color
значение которых начинается с. a
Когда вы выполняете запрос к базе данных Firebase, потенциально может быть несколько результатов. Таким образом, снимок содержит список этих результатов. Даже если есть только один результат, снимок будет содержать список из одного результата.
Ваш обратный вызов должен будет обработать этот список, выполнив цикл, используя DataSnapshot.forEach
для перебора дочерних элементов:
function handler(snapshot) {
snapshot.forEach(function(e) {
console.log(e.val());
});
}
database.ref('user').orderByChild('color').startAt('a').on('value', handler);
Комментарии:
1. Спасибо. Я не понимаю разницы между
startAt('a')
amp;startAt('a').endAt('auf8ff')
. Я видел, как кто-то использовал startAt (‘a’) для аналогичной задачи, и это сработало (29 минут здесь: youtube.com/watch?v=2CtQEXwOPXw )2. Как сказано в моем ответе, вы, похоже, думаете, что
startAt
этоstartsWith
операция, а это не так. Если вы не понимаете разницы, я рекомендую сначала попробовать код в моем ответе, а затем поиграть с различными значениями дляendAt
, пока это не обретет смысл. Причина, по которой сценарий в видео работает, заключается в том, что они запускают последний элемент в списке.3. Верно ли это:
orderByChild("color")
упорядочивает людей в алфавитном порядке на основе их значения дляcolor
? ЗатемstartAt
находит человека, чейcolor
первый символ"a"
и включает всех людей под ним (на основе этой новой схемы упорядочения)?4. Да, именно так работают запросы Firebase: сначала вы указываете Firebase, какой индекс загружать (в котором данные упорядочены определенным образом), а затем какой фрагмент данных возвращать.
5. Отлично. Не могли бы вы объяснить, как
endAt
это работает (в сочетании сstartAt
)? Тогда я смогу реализовать ваше решение, зная, что оно делает