【发布时间】:2015-08-29 19:21:20
【问题描述】:
您好,互联网用户,
我目前正在使用 Firebase,并尝试查询以下结构:
items
1
- name: "Car"
- Children
- 2
- 3
2
- name: "Wheels"
3
- name: "Engine"
你可以从这个例子中看到,我有一个 ID 为 1,2 和 3 的项目数组。1 也有自己的子数组,称为 Children,它由 ID 2 和 3 组成。
我将如何进行 Firebase 查询,仅拉回具有名为 children 的数组的 Id?
起初,我认为类似以下的方法会起作用:
<my firebase path>.child('items').orderByChild('Children').once('value', function(snap){
// ... No results :(
});
运气不好。接下来,我尝试在 1 的 Id 中添加一个名为 hasChildren = true 的属性,然后像这样查询。
<my firebase path>.child('items').orderByChild('hasChildren').equalTo(true).once('value', function(snap){
// ... iterate over results, which in this case is the Id 1
});
但是,当我执行 snap.ForEach(function(data)... 然后查看 data.val().Children 时,它只是一个空白结果,这让我感到困惑,因为我认为 Firebase 拉回了所有子节点. 因此,需要扁平化您的数据。
如何获得这些 Children 值?
** 更新 ** 添加 Plunker
http://plnkr.co/edit/9U0ujEwdKi7sgQGmd6IE?p=preview
看起来这是一部错误喜剧。
1) 在简单的示例中,1、2 和 3 是有序的,因此 firebase 将其视为一个数组。在现实世界中,这些数字更加随机,因此 firebase 将它们视为对象,因为它们没有排序。
2) 出于某种原因,Intellij 没有显示 Children 对象的内容。我必须输入类似 data.val().Children['3'] 的内容来获取值或类似 for(var property in data.val().Children) 的内容来遍历字段。奇怪的。
3) 我 STILL 不能做 .child('items').orderByChild('Children') ... 因为这会返回所有记录。然而,奇怪的是,它会首先返回那些有孩子的人。
【问题讨论】:
-
如果您使用 RESTful 数据结构通过像
https://blistering-inferno-9999.firebaseio.com/items/1/children这样的完整 URL 进行查询会发生什么? -
@pie-o-pah 我收到一个数组,我可以使用 snap.forEach 对其进行迭代,因此直接访问它们可以正常工作。
-
在注释
// Do some stuff的行中,您不应该在该范围内获得data吗? (即那里的回调(数据))。我怀疑您收到undefined是因为您的回调不在forEach()范围内。 -
@pie-o-pah 是的,这是一个不好的例子。已移除。你可以看到我的 plunker 和对发生的事情的解释。
-
目前还不清楚您的目标是什么。您的 plunker 中的代码正在运行。如果您不愿意添加 hasChildren 标志,那么是的,简单地使用 orderByChild('Children') 将不起作用。 firebase.com/docs/web/guide/… 我的最佳建议是扁平化您的数据,因为这是 Firebase 的最佳实践。
标签: firebase