Разница в базе данных Firebase Realtime между моментальными снимками данных

#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. Настройте прослушиватель для получения событий изменения данных.

Трафик зависит от нашего использования. Когда ваши данные не нуждаются в обновлении в реальном времени, вы можете просто вызвать метод для получения данных (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