小编典典

在Firebase中的AutoID下方进行查询

swift

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) })

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

我试过了:

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如上所述无法进行添加。


阅读 234

收藏
2020-07-07

共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) })
2020-07-07