Как я могу получить доступ к одноименным дочерним элементам в firebase без указания имени родителя - PullRequest
0 голосов
/ 13 июля 2020

У меня есть такая база данных

введите описание изображения здесь

Я хочу получить доступ только к базовым c данным всех дочерних элементов без записи их идентификаторов. Я использовал этот блок кода, и он сработал. Но очень медленно.

constructor() {
    super();
    this.state = {
      staffsBasics: [],
    };
    this.componentDidMount = this.componentDidMount.bind(this);
  }

  componentDidMount() {
    firebase.database().ref('staff-list').on('value', (snap) => {
      for (let i = 0; i < snap.numChildren(); i++) {
        firebase.database().ref("staff-list/" + i + "/basic").on("value", (snap) => {
          this.setState({
            staffsBasics: [...this.state.staffsBasics, snap.val()]
          });
        });
      }
    });
  }

Есть ли лучший способ получить доступ только к дочерним элементам с одинаковыми именами?

Я пробовал orderbychild, но он тоже дает все данные.

1 Ответ

0 голосов
/ 13 июля 2020

После того, как вы прочитаете определенное место из Firebase, полученный снимок данных будет содержать всю информацию в этом месте. Таким образом, нет необходимости выполнять вложенные вызовы API для получения данных из-под /staff-list/i.

С этими знаниями ваш код может стать:

firebase.database().ref('staff-list').on('value', (snap) => {
  snap.forEach((child) => {
    this.setState({
      staffsBasics: [...this.state.staffsBasics, child.val().basics]
    });
  }
});

Если вы обнаружите, что вам это регулярно требуется, подумайте об изменении структуры данных, чтобы лучше соответствовать варианту использования, поскольку вы загружаете больше данных, чем необходимо прямо сейчас.

Например, я бы подумал о наличии отдельных списков более высокого уровня (staff-list-basics, staff-list-details, et c) с теми же дочерними ключами, а затем загрузка только с этого ключа.

...