Firebase orderByChild не возвращает массив - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь получить некоторые данные из моей базы данных Firebase, но я застрял на одной маленькой проблеме.

Это мой объект:

{
  "icons": [
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fdog.png?alt=media&token=08e0e162-8a72-467b-acdd-4085ac35e9c5",
      "alt": "Dog icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fcat.png?alt=media&token=1e58598b-00dc-4684-a349-00e1f9161256",
      "alt": "Cat icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Ffish.png?alt=media&token=614d7867-2d43-48b7-a3ad-2680de6c7e10",
      "alt": "Fish icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fbird.png?alt=media&token=a7020145-1a30-4728-a9bb-144716213e55",
      "alt": "Bird icon."
    },
    {
      "type": "animal",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fhamster.png?alt=media&token=2ee69ccc-ef55-4219-850f-7c0c384aafb6",
      "alt": "Hamster icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F0_hamburger.png?alt=media&token=96c8779f-e261-448c-abce-41449b527f1f",
      "alt": "Burger icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F1_search.png?alt=media&token=194afb95-fd57-4a48-acb0-63893c7111fa",
      "alt": "Search icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F2_faq.png?alt=media&token=08f1e338-4e2b-4d72-a88f-4bbabf903da3",
      "alt": "Faq icon."
    },
    {
      "type": "general",
      "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F3_divider.png?alt=media&token=e7dddb6e-a241-4819-8a35-5facfaf45dab",
      "alt": "Divider icon."
    }
  ]
}

Теперь, когда я используюЭтот запрос для выбора некоторых данных я получаю результат, который я хочу (обратите внимание на equalTo ()):

  componentWillMount = () => {
    database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
      // this.setState({ icons: snap.val() });
      console.log(snap.val());
    })
  }

Результат: ожидаемый журнал

enter image description here

Но теперь, когда я изменяю поле equalTo () на 'general' - тип других значков - он не возвращает массив.

  componentWillMount = () => {
    database.ref('icons').orderByChild('type').equalTo('general').on('value', snap => {
      // this.setState({ icons: snap.val() });
      console.log(snap.val());
    })
  }

Результат: неправильный вывод

enter image description here

Как видите, теперь он возвращает объект вместо массива.Теперь мой вопрос: как я могу это исправить, чтобы тип 'general' также возвращал массив?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

База данных Firebase Realtime не хранит массивы.Вместо этого он хранит их как обычные объекты JavaScript, которые просто имеют последовательные цифровые ключи.Таким образом, данные, которые вы храните, на самом деле хранятся так:

{
  "icons": {
    "0": { "type": "animal", "url": "...", "alt": "Dog icon." },
    "1": { "type": "animal", "url": "...", "alt": "Cat icon." },
    "2": { "type": "animal", "url": "...", "alt": "Dog icon." },
    "3": { "type": "animal", "url": "...", "alt": "Cat icon." },
    "4": { "type": "animal", "url": "...", "alt": "Dog icon." },
    ...
  }
}

Таким образом, когда вы выполняете запрос, вы получаете подмножество этих результатов.В вашем случае кажется, что вы получаете результаты с 5 по 8. Когда клиент Firebase получает результат, который выглядит как массив, он преобразует его обратно в массив.Но для этого необходимо, например, чтобы индекс первого результата был 0, чего в данном случае нет.Таким образом, вместо этого вы получаете необработанный результат из JSON.

Чтобы получить его в массив, вы должны преобразовать его самостоятельно.Это довольно просто, с чем-то вроде:

database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
  let result = [];
  snap.forEach(child => {
    result.push(child.val());
  });
  console.log(result);
})

Также смотрите:

0 голосов
/ 29 ноября 2018

на основе Firebase документы * Метод 1002 * val () может возвращать разные типы данных

В зависимости от данных в DataSnapshot, метод val () может возвращать скалярный тип(строка, число или логическое значение), массив или объект.Он также может возвращать ноль, указывая, что DataSnapshot пуст (не содержит данных).

, если вам нужно перебрать возвращаемые значения, лучше использовать метод forEach ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...