Firebase orderByChild不返回数组

时间:2018-11-29 11:37:10

标签: reactjs firebase firebase-realtime-database

我正在尝试从Firebase数据库中检索一些数据,但是我遇到了一个小问题。

这是我的对象

turn right

现在,当我使用此查询选择一些数据时,我会得到想要的结果(请注意equalTo()):

{
  "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."
    }
  ]
}

结果:预期的日志

enter image description here

但是现在当我将equalTo()字段更改为“ general”(其他图标的类型)时,它不会返回数组。

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

结果:输出错误

enter image description here

如您所见,它现在返回一个对象而不是数组。 现在我的问题是:如何解决这个问题,以便类型'general'也返回数组?

谢谢。

2 个答案:

答案 0 :(得分:1)

Firebase实时数据库不存储阵列。而是将它们存储为常规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);
})

另请参阅:

答案 1 :(得分:0)

基于Firebase documents val()方法可以返回不同的数据类型

  

根据DataSnapshot中的数据,val()方法可能返回标量类型(字符串,数字或布尔值),数组或对象。它还可能返回null,表示DataSnapshot为空(不包含数据)。

如果您需要遍历返回的值,最好使用forEach()方法。