在 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的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:如何在 [Firebase] 中使用 OR 条件获取流查询