ios - 在 Firebase 中查询嵌套元素

标签 ios swift firebase firebase-realtime-database

我正在尝试使用 swift 查询 Firebase 集合。

我的收藏是这样的:

{
  "networks" : {
    "-KF9zQYGA1r_JiFam8gd" : {
      "category" : "friends",
      "members" : {
        "facebook:10154023600052295" : true
      },
      "name" : "My friends",
      "owner" : "facebook:10154023600052295",
      "picture" : "https://my.img/img.png"
    },
    "-KF9zQYZX6p_ra34DTGh" : {
      "category" : "friends",
      "members" : {
        "tototata" : true
      },
      "name" : "My friends2",
      "owner" : "facebook:10154023600052295",
      "picture" : "https://my.img/img.png"
    }
  }

我的查询是这样的:

let networksRef = ref.childByAppendingPath("networks")
                     .queryOrderedByChild("members")
                     .queryEqualToValue(true, childKey: uid)

然后我使用 FirebaseUI 填充 TableView。

问题是查询没有返回任何东西,我也试过使用这种查询:

let networksRef = ref.childByAppendingPath("networks")
                     .queryOrderedByChild("members")
                     .queryStartingAtValue(true, childKey: uid)
                     .queryEndingAtValue(true, childKey: uid)

需要明确的是,“uid”是嵌套在“members”节点中的节点名称,值为 true。 (如图所示)

由于要下载的数据量大,我无法在不过滤的情况下获取所有节点。

我坚持了一天,我快疯了..:-)

如果有人可以帮忙?

最佳答案

正确的语法是:

let networksRef = ref.childByAppendingPath("networks")
                     .queryOrderedByChild("members/\(uid)")
                     .queryEqualToValue(true)

但请注意,您需要为每个 uid 建立一个索引才能有效地工作:

{
  "rules": {
    "networks": {
      ".indexOn": ["facebook:10154023600052295", "tototata"]
    }
  }
}

如果没有这些索引,Firebase 客户端将下载所有数据并在本地进行过滤。结果是一样的,但它会消耗大量不需要的带宽。

一个合适的解决方案需要你改变你的数据结构。在 Firebase(以及大多数其他 NoSQL 数据库)中,您通常最终会以应用程序想要访问它的方式对数据进行建模。由于您正在寻找用户所属的网络,因此您应该存储每个用户的网络:

"networks_per_uid": {
  "facebook:10154023600052295": {
    "-KF9zQYGA1r_JiFam8gd": true
  },
  "tototata": {
    "-KF9zQYZX6p_ra34DTGh": true
  },
}

将这个所谓的索引添加到您的数据结构称为反规范化,在 this blog post 中介绍。 , documentation on data structuring还有这篇关于 NoSQL data modeling 的精彩文章.

关于ios - 在 Firebase 中查询嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36580621/

相关文章:

ios - 无符号表达式的比较 >=0 始终为真

ios - 有谁知道是否可以在 iOS 8 的自定义键盘扩展中使用麦克风?

ios - swift : Player audio file from another class file

node.js - 如何仅在更新字段时触发 firebase 云功能?

ios - iOS 上的 Firebase Analytics 事件 - 测试和生产

firebase - 如何为 firebase 创建服务帐户以与 firebase 功能一起使用

ios - 使用联系人框架创建新组,CNErrorDomain Code = 2

ios - 快速从核心数据中获取会导致崩溃,因为我收到了其他类型的对象

objective-c - NS_SWIFT_NAME 是否保留给工厂方法?

ios - 如何从 Parse 查询中获得超过 1000 个结果?