在 Firebase 中查询以下 AutoID

Posted

技术标签:

【中文标题】在 Firebase 中查询以下 AutoID【英文标题】:Querying below AutoID's in Firebase 【发布时间】:2017-04-04 10:23:27 【问题描述】:
Results
- auto generated ID
  - auto generated ID
       value1: abc
       value2: def

我希望能够查询“value2”等于某个特定值的位置。我从一个参考开始:

let ref = FIRDatabase.database().reference().child("Results")

由于我不知道自动生成的 ID 以提供路径,我是否需要先获取它们才能确定可以使用 .queryEqualToValue 的值?如果是这样,我不只是抓取每条记录来寻找一个值,而不是使用某种索引来抓取那些value2 等于一个值的记录吗?

最后,我想要一个返回所有“记录”的查询,其中value2 等于某个值。感觉就像我需要遍历每条记录才能做到这一点。我觉得我在这里错过了一些东西。

更新:

我试过了:

self.ref.queryOrderedByKey().queryEqual(toValue: "def", childKey: "value2").observeSingleEvent(of: .value, with: (snapshot) in
            print(snapshot) )

这会因我在下面的 cmets 中给出的错误而崩溃。

我试过了:

self.ref.queryOrdered(byChild: "value2").queryEqual(toValue: "def").observeSingleEvent(of: .childAdded, with: (snapshot) in

这永远不会执行闭包。如果我将观察者更改为".value"它返回null。

如果我这样做:

self.ref.queryOrdered(byChild: "value2").observeSingleEvent(of: .childAdded, with: (snapshot) in

它实际上会正确地对数据进行排序。使用".value" 无法正确排序无论如何,添加queryEqual 然后无法按上述方式工作。

【问题讨论】:

认为您可能会发现 this 对您的场景非常有用 我认为我从中得到的是,如果不遍历项目,您将无法做到这一点。 @C6Silver 我目前的情况与您的问题完全相同。你是怎么解决的? @LanceSamaria - 请查看已接受的答案和我的后续 cmets。数据需要重组。 @C6Silver 嘿,感谢您的回复。我不知道如何组合两个自动 ID。我发现在具有 1 级的不同节点上复制该数据然后使用自动 ID 的组合更容易。 【参考方案1】:

Firebase 数据库查询比您运行它们的位置更深一层的属性。它们不能在其下包含动态路径。

由于您是从/Results 查询的,因此您可以对/Results/$id/PropertyName 下的属性进行排序/过滤。

要允许对/Results/$id1/$id2/PropertyName 下属性上的所有项目进行排序/过滤,您需要更改/增加您的数据结构。例如:

ResultValues
   -auto_generated_ID1_auto_generated_ID2_value1
       value: abc
       path: "auto generated ID/auto generated ID"
   -auto_generated_ID1_auto_generated_ID2_value2
       value: def
       path: "auto generated ID/auto generated ID"

现在您可以通过以下方式查询:

ref.child("ResultValues")
   .queryOrderedByChild("value")
   .queryEqual(toValue: "def")
   .observeSingleEvent(of: .value, with: (snapshot) in
            print(snapshot) )

【讨论】:

非常有帮助,谢谢!至少这节省了我尝试完成这项工作的时间。上述方法的问题在于,您不能轻易地仅提取属于第一个自动生成的 ID 的项目,因为它现在是一个组合键。我想接下来的重点是创建一个包含一些重复数据的单独结构,以便处理您只希望所有数据与第一个键关联的时间。 是的。数据复制部分是这里的关键。您复制的精确数据取决于您。在上面的示例中,我只是连接了键,然后在/Results 下为项目添加了路径属性

以上是关于在 Firebase 中查询以下 AutoID的主要内容,如果未能解决你的问题,请参考以下文章

在 Firebase 中查询现有节点返回 null

如何在一个块中获取 Firebase 查询的所有结果

在reactjs中解析firebase查询数据

Flutter:如何在 [Firebase] 中使用 OR 条件获取流查询

如何在 Bigquery 中查询每小时分解的 Firebase 事件报告?

如何使用 Swift 在 Firebase 中使用 equalTo 查询查找子节点? [复制]