【问题标题】:Search firebase by Child of child value按子值的子级搜索 firebase
【发布时间】:2017-06-29 14:00:36
【问题描述】:

我有一个类似这样的 firebase 数据库结构

是否可以通过电子邮件地址查询“a@a.com”并检索键“1248769d7j8”及其父键“deaf7834jd8d7j-78”?

我的解决方案是让数据库结构更扁平。但是我想知道是否可以在不进行非规范化的情况下通过

更新:就我而言,124... 和 dea... 都是未知的唯一 ID

【问题讨论】:

  • 不,这是不可能的。您可以在按子排序(例如some/deep/property)和定义索引时指定深度路径,但所述路径的组件需要是已知名称(可以这么说)并且1248769d7j8 似乎是一个未知的ID当您定义安全规则(用于索引)等时。
  • 谢谢,我是这么认为的。将创建数据库的不同分支
  • @cartant 请看答案,因为这很容易做到。
  • @Jay 我应该说的更像是:不,不可能为您要进行的查询编制索引。我注意到您的回答没有使用 OP 的数据。如果是这样,您将有一个 queryOrdered(byChild: "1248769d7j8/email") 在其中 - 显然无法索引。任何建议该方法的答案都应包含警告。
  • @cartant 不确定您所指的索引与答案无关。此外,更重要的是,答案同样适用于 OP 数据(刚刚对其进行了测试)——所有键名都是字符串,并且在 Firebase 中的处理方式相同——无论是“1247869d7j8”还是“详细信息”。也许我误解了评论。

标签: database firebase firebase-realtime-database


【解决方案1】:

编辑:答案最初是肯定的,但是,更新了信息 从 OP,父节点 'deaf...' 和子节点 '1248...' 都是未知数,因此无法进行深度查询。

如果子节点 '1248' 与 deaf... 节点的每个子节点的键一致,则答案是肯定的。

是的,您当然可以获得父节点以及父节点的父节点。这是 Swift,因为没有指定平台,但概念是一样的。

给定一个结构

root
  posts
    post_1
      details
         posted_by: "Leroy"
    post_2
      details
         posted_by: "Bill"

让我们通过深度查询来查询 Leroy 节点:

let postsRef = ref.child("posts")

let queryRef = dataRef.queryOrdered(byChild: "details/posted_by")
                      .queryEqual(toValue: "Leroy")
queryRef.observeSingleEvent(of: .value, with: { (snapshot) in
   let a = snapshot.key //the posts node
   print(a)

   for child in snapshot.children {
       let childSnap = child as! FIRDataSnapshot        
       print(childSnap.key) //the direct parent node
   }
})

结果会打印出来

posts
post_1

另一种选择是像这样将父节点包含在较低级别的节点中

root
  deaf91298823
    1248
     email: "asad@asdd.com"
     name: "Adam"
     parent_node: "1248"
     parent_parent: "deaf91298823"

【讨论】:

  • 对于任何处于类似困境的人来说,这是一个很好的答案。但是,就我而言,我不能这样做let postsRef = ref.child("posts"),因为帖子是一个未知的唯一ID。更新了我的问题以澄清。
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 2017-05-09
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2021-09-09
相关资源
最近更新 更多