【问题标题】:How to query for existence of child array in Firebase?如何在 Firebase 中查询子数组的存在?
【发布时间】: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


【解决方案1】:

DataSnapshot.forEach 在回调中返回另一个快照。因此,您必须使用data.val().Children,而不是尝试访问data['Children']

【讨论】:

  • 已发布代码。我正在使用 Intellij,所以它甚至在我的 IDE 调试器中返回一个空数组。
  • 我不太确定。我用你的代码和数据结构创建了一个 plunker,它工作正常。 plnkr.co/edit/756IyinB01E1GLtA5SHu你能用你所有的代码创建一个 plunker 吗?
  • Plunker 添加。在更新部分添加一些额外的注释。
【解决方案2】:

看起来修改我的数据结构是最好的方法,因为此时无法检查数组对象的存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多