查询未知父firebase的子快照

Posted

技术标签:

【中文标题】查询未知父firebase的子快照【英文标题】:Query child snapshot of unknown parent firebase 【发布时间】:2019-07-18 09:33:33 【问题描述】:

我正在尝试使用未知父级的 childKey 获取子级快照,而不更改数据结构。

我尝试将queryOrderByChildIdqueryEqual(toValue:, childKey:) 一起使用,但我的问题是子快照是字典,我只知道键,不知道值。

有什么方法可以将值操作为 Any 值,以便我能够获取子快照。

我知道title/id1、id3和id3的时间戳

数据结构:

title:
    id1:
         id2:
              id3:
                   timestamp: 101010101
                   visible: true

代码:

ref.child("title").child(id1).queryOrderedByKey().queryEqual(toValue: _, childKey: id3)
   .observeSingleEvent(of: .value)  (snapshot) in
      print(snapshot)

输出值为空

编辑:

最后我这样解决了:

ref.child("title").child("id1").queryOrdered(byChild: "id3/timestamp").queryEqual(toValue: 101010101).observeSingleEvent(of: .value)  (snapshot) in
       print("id2 is: ", (snapshot.value as? [String: Any])?.keys.first)

【问题讨论】:

【参考方案1】:

Firebase 数据库查询在您运行查询的位置的直接子节点上运行。整个路径中只能有一个未知键:您查询的节点正下方的节点。

因此,如果您知道路径的title/id1 部分,则可以根据其下已知路径(如date/month)处的键、值或属性查询级别id2 上的节点。

如果知道title/id1/id2,可以查询id3级别的节点。但是你不能查询那些,如果你只知道他们路径的title/id1 部分。

另见:

Firebase Query Double Nested Firebase query if child of child contains a value

【讨论】:

好的,谢谢,假设我知道 title/id1、id3 和 id3 的时间戳,我的查询应该是什么样子才能获得 id3 datasnapshot.value? @坦率 如前所述:查询中只能有一个未知级别。如果你只知道title/id1,那么你是在尝试查询title/id1/*/*/timestamp,这是不可能的。 正如我提到的,我也知道 id3 的值 和时间戳的值。这有帮助吗?我知道title/id1/*/id3/timestamp@frank 我不知道只有 id2 @Frank 的值 如果id3/timestamp 是固定路径,您可以在id1 下为其创建索引,并以这种方式查询。但是如果id3 对于许多子节点来说是不同的,那就是分类问题。在这种情况下,请检查我对链接的第二个问题的回答。请注意,如果您不使用id1id2id3 将问题抽象化,而是显示实际值及其含义,则更容易理解您正在尝试的内容以及如何完成。

以上是关于查询未知父firebase的子快照的主要内容,如果未能解决你的问题,请参考以下文章

Firebase:在不知道父级的情况下查询内部子级

Swift Firebase 快照查询缺少孩子

如何将来自 Firebase 的查询快照转换为不同的对象?

当数据存在时,Swift firebase 快照返回 null

Firestore:如果两个侦听器监听相同的查询 firebase 维护两个不同的查询快照?

Flutter firebase 查询快照错误:“未处理的异常:错误状态:无元素”