#javascript #firebase #firebase-realtime-database
#javascript #firebase #firebase-realtime-database
Вопрос:
Если у меня есть структура базы данных, подобная приведенной здесь, и я выполняю запрос, как показано ниже.Есть ли разница в трафике, используемом для загрузки моментального снимка из базы данных, если я обращаюсь к каждому узлу с помощью snapshot.forEach(function(childSnapshot)
и если я не обращаюсь к узлам?
Если разницы нет, есть ли способ получить доступ только к ключам в Chats
без получения данных моментального снимка для того, что содержит каждый ключ.Я предполагаю, что таким образом он будет генерировать меньше загруженных данных
var requests = db.ref("Chats");
requests.on('child_added', function(snapshot) {
var communicationId = snapshot.key;
console.log("Chat id = " communicationId);
getMessageInfo(
communicationId,
function() {
snapshot.ref.remove();
}
);
Ответ №1:
При вызове requests.on('child_added', ...)
вы всегда будете получать доступ ко всем данным на requests
узле. Не имеет значения, что вы делаете в функции обратного вызова. Весь узел загружается в память, и стоимость запроса оплачивается. То, что вы делаете со снимком в памяти, больше ничего не стоит.
Если вы не хотите, чтобы все дочерние узлы находились под requests
, вам следует найти какой-нибудь способ отфильтровать запрос только для тех дочерних узлов, которые вам нужны.
Комментарии:
1. Большое вам спасибо за ваш ответ. Хотя у меня есть другой вопрос, если я включу автономные возможности, снизит ли это стоимость запроса?
2. Если у вас есть другой вопрос, пожалуйста, разместите его отдельно, объяснив конкретную ситуацию. Вопросы о переполнении стека должны быть ограничены только одним вопросом, чтобы в будущем быть максимально полезными для других.
Ответ №2:
Как упоминалось в документации, можно использовать любой из этих методов:
- Вызовите метод для получения данных.
- Настройте прослушиватель для получения событий изменения данных.
Трафик зависит от нашего использования. Когда ваши данные не нуждаются в обновлении в реальном времени, вы можете просто вызвать метод для получения данных (1)
Но если вы хотите, чтобы ваши данные обновлялись в режиме реального времени, тогда вам следует выбрать (2). Когда вы устанавливаете прослушиватель, Firebase отправляет вашему прослушивателю первоначальный снимок данных, а затем другой снимок при каждом изменении дочернего элемента.
(1) — Пример
firebase.database().ref('/users/').once('value') // Single Call
(2) — Пример
firebase.database().ref('/users/').on('child_added') // Every Update It is Called
И еще, я думаю, вы не можете получить все ключи, потому что, когда вы ссылаетесь на дочерний элемент и извлекаете данные, firebase сама отправляет их в виде пар ключ-значение (DataSnapshot).
Дополнительная ссылка:
https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot
https://firebase.google.com/docs/database/web/read-and-write