我正在尝试从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."
}
]
}
结果:预期的日志
但是现在当我将equalTo()字段更改为“ general”(其他图标的类型)时,它不会返回数组。
componentWillMount = () => {
database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
// this.setState({ icons: snap.val() });
console.log(snap.val());
})
}
结果:输出错误
如您所见,它现在返回一个对象而不是数组。 现在我的问题是:如何解决这个问题,以便类型'general'也返回数组?
谢谢。
答案 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()方法。