【问题标题】:How to query nested elements in Firebase?如何在 Firebase 中查询嵌套元素?
【发布时间】:2016-05-22 10:00:25
【问题描述】:
    "John" : {
      "David" : {
        "-KIMA0aPsujdAOpkzP0w" : {
          "message" : "hallu",
          "sender" : "10154053432889835",
          "time" : 1463898873196
        }
      }
    },
    "Harry" : {
      "Christina" : {
        "-KIMA0aPsujdAOpkzP0v" : {
          "message" : "hallu",
          "seen" : true,
          "sender" : "self",
          "time" : 1463898873195
        }
      },
      "Pierce" : {
        "-KILZ_GH7Ji9hQYNK-6p" : {
          "message" : "Eli there.",
          "seen" : true,
          "sender" : "179914035712208",
          "time" : 1463888795301
        },
        "-KIM8yPz2UDOZwHEg_nn" : {
          "message" : "hahjajak",
          "seen" : true,
          "sender" : "self",
          "time" : 1463898597847
        },
}

我想查询 JohnHarry 的顶部节点的“seen”键值为“true”的节点数,其中有多个子节点每个子节点有多个子节点,子节点自动设置了id。

我只想知道将“seen”键设置为 true 的对象的数量以及将“seen”键设置为 false 的对象的数量

我可以提取节点中的所有值如下:

ref.observeSingleEventOfType(.Value, withBlock: { snap in
    for (key,value) in snap.value as! NSDictionary {
    }
    
})

我可以遍历字典并手动计算对象的数量。但这在计算上或数据效率上并不高,因为 firebase 是基于体积的。

我想知道是否有任何查询来计算根节点中“seen”键为“true”或根节点中“seen”键为“false”的对象的数量。

更新:

数据结构

JohnHarry 是用户唯一 ID。 John 节点的直接子节点 David 是用户之前与之聊天的人的唯一 ID。

KIMA0aPsujdAOpkzP0w 节点代表用户 JohnDavid 之间的唯一消息。

所以我想要的是计算 DavidJohn 没有被 John

看到的消息数量

【问题讨论】:

  • 作为一般经验法则,最好将实际的 Firebase 数据结构粘贴为文本而不是图像。 Firebase 控制台 -> 数据 -> 右上角三个点,导出 JSON。原因是:它是可搜索的,而且我们不必在答案中重新输入您的结构。
  • 好建议!更新了谢谢:)
  • 好的。最后一件事。你有一个模棱两可的情况;您想查询 top node 的 'seen' 键值为 true 的节点数,这两个节点是列出的。但是,那些顶部节点没有“seen”的子节点。您问题的最后一部分说 计算根节点中“seen”键为“true”或根节点中“seen”键为“false”的对象的数量,但您的根节点没有有一个“看见”的钥匙。我想我知道你在问什么,但想确定一下。哦,您对只是这两个顶级节点特别感兴趣吗?你能澄清和更新你的问题吗?
  • 根据您的建议完成更新
  • 我有一个类似的情况,但我的数据是基于日期的所以我有类似年>月> uniqueKeyCreatedByFirebase>TheObjectData的东西。我仍然坚持下去。您是否为此找到了合适的解决方案?我的问题在这里:stackoverflow.com/questions/42026092/…

标签: ios objective-c swift firebase


【解决方案1】:

如果您只想获得“seen”的值,您应该重新考虑您的数据库结构并在可能的情况下进行非规范化以尽可能快地读取。

保持结构获得“可见”值,每次读取都必须获取整个节点并循环访问以获取值,下载不必要的数据,浪费处理时间并使整体操作变慢。

您应该创建一个新节点,并以稍后获取它的方式存储“seen”值。可以说,构建数据库的最佳方式是基于要执行的读取操作以及在这些操作中需要哪些数据。

您不必担心重复数据。请记住,Firebase 具有“updateChildren”方法,可让您在单个操作中更新不同节点中的数据。

有关更多信息,您可以在此处阅读有关结构化数据的文档:https://firebase.google.com/docs/database/android/structure-data

干杯!

【讨论】:

  • 我完全同意下载数据和进程不是有效的方式。这就是为什么我想知道 firebase 是否有某种查询此类数据的方法。
【解决方案2】:

不确定这是否是最有效的处理方法,但对于快速原型,我也一直在寻找这个问题的答案。我决定使用这种策略来隔离数据结构的子节点:

   ref.observeSingleEventOfType(FIRDataEventType.Value, withBlock: { snapshot in
        for (key,value) in snapshot.value as! NSDictionary {

            if (key as! String == "John/David/etc")
            {
                let newRef  = FIRDatabase.database().reference().child("John").child(key as! String)

                newRef.observeSingleEventOfType(FIRDataEventType.Value, withBlock: { snapshot in

                    for (childKey, childValue) in snapshot.value as! NSDictionary{
                       //do whatever you want with child values/etc
                    }

                })
            }

        }

    })

请记住,我对 iOS 上的 Firebase 非常陌生,他们只是更改了他们的文档,所以我正在尽我所能完成它。我确信有更好的方法来完成访问子数据,但这适用于我的 MVP,所以我选择了它。

编辑:这假设您的原始参考针对的是您想要定位的数据树部分。例如:

   let ref = FIRDatabase.database().reference().child("John")

这样,当您执行 ref.observeSingle..etc 时,它会查找该子对象下的值,而不是整个树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多