swift - 查询嵌套数据如何工作?我还能检索下一级的数据吗?

标签 swift firebase firebase-realtime-database

我想查询下两级的数据,但是我仍然能够从其原始节点检索数据吗?

为了更好地解释,我的 Firebase 数据库如下所示:

posts
  -192u3jdj0j9sj0
     -message: haha this is funny (CAN I STILL GET THIS DATA)
     -genre: comedy (CAN I STILL GET THIS DATA)
        -author
           -user: "jasonj"
        -comment
           -ajiwj2319j0jsf9d0jf
               -comment: "lol"
               -user: "David" (QUERY HERE****)
           -jfaiwjfoj1ijifjojif
               -comment: "so funny"
               -user: "Toddy"

我本质上想查询大卫发布的所有评论。但是,根据查询的工作原理,我仍然可以获取来自“level 1”的原始内容(消息和类型)吗?或者我必须重组我的数据吗?可能会在评论下重写 1 级数据。

(最终目标:类似于雅虎答案,用户可以在其中看到他发布的问题以及他发布评论的问题)

下面的代码可以工作,但我不确定如何提取 1 级数据或者是否可能

   ref = Database.database().reference().child("posts").child(myPost).child("comment")
    var queryRef:DatabaseQuery
    queryRef = ref.queryOrdered(byChild: "user").queryEqual(toValue: "David")
    queryRef.observeSingleEvent(of: .value, with: { (snapshot) in
        if snapshot.childrenCount > 0 {

最佳答案

您当前的数据结构可以轻松查找特定帖子的评论。然而,它并不容易找到特定作者的评论。原因是 Firebase 数据库查询将您的内容视为平面节点列表。您要过滤的值必须位于每个节点下的固定路径。

为了允许查找特定作者的评论,您需要添加一个额外的节点来保存该信息。例如:

"authorComments": {
  "David": {
    "-192u3jdj0j9sj0_-ajiwj2319j0jsf9d0jf": true
  },
  "Toddy": {
    "-192u3jdj0j9sj0_-jfaiwjfoj1ijifjojif": true
  }
}

这种结构通常称为反向索引,它可以让您轻松找到特定用户的评论路径(我使用 _ 作为上面路径段的分隔符)。

在使用 NoSQL 数据库时,这种数据重复非常常见,因为您经常需要修改/扩展数据结构以允许应用程序所需的用例。

另请参阅我的回答:

关于swift - 查询嵌套数据如何工作?我还能检索下一级的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58365976/

相关文章:

java - Android - Firebase onChild添加了如何监听所有 child

java - 如何使用 firebase 登录 token ?

ios - 滚动 Collection View 时,cellForItemAt indexPath 会出现问题

ios - 如何获取按时间戳排序的消息

ios - 使用 constraintEqualToAnchor() 时如何在设置自动布局约束后更改它们?

java - Firestore 中是否有像 Firebase 中一样的 onChildAdded 方法?

java - Android 推送通知 Firebase

android - 无法以列表形式读取 Firebase 数据库中的数据

Swift - findObjectsInBackgroundWithBlock 总是返回 nil

快速的http请求。不通过