在 Firebase 中的 AutoID 下查询

C6S*_*ver 5 firebase swift firebase-realtime-database

Results
- auto generated ID
  - auto generated ID
       value1: abc
       value2: def
Run Code Online (Sandbox Code Playgroud)

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

let ref = FIRDatabase.database().reference().child("Results")
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

我试过了:

self.ref.queryOrderedByKey().queryEqual(toValue: "def", childKey: "value2").observeSingleEvent(of: .value, with: {(snapshot) in
            print(snapshot) })
Run Code Online (Sandbox Code Playgroud)

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

我试过了:

self.ref.queryOrdered(byChild: "value2").queryEqual(toValue: "def").observeSingleEvent(of: .childAdded, with: {(snapshot) in
Run Code Online (Sandbox Code Playgroud)

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

如果我这样做:

self.ref.queryOrdered(byChild: "value2").observeSingleEvent(of: .childAdded, with: {(snapshot) in
Run Code Online (Sandbox Code Playgroud)

它实际上会对数据进行正确排序。".value"不管怎样,它都不会正确排序,添加queryEqualthen 不起作用,如上所述。

Fra*_*len 4

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"
Run Code Online (Sandbox Code Playgroud)

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

ref.child("ResultValues")
   .queryOrderedByChild("value")
   .queryEqual(toValue: "def")
   .observeSingleEvent(of: .value, with: {(snapshot) in
            print(snapshot) })
Run Code Online (Sandbox Code Playgroud)