如何在嵌套criteria属性时查询Firebase数据库对象?

时间:2017-01-02 14:21:03

标签: ios swift firebase firebase-realtime-database

我在Firebase数据库中有以下结构:

root
 - Users
 - Posts
   - -K_54s1smPPh6qN4znuT
     - key1: val
     - key2: val
     - User:
       - -K_54sSomeKeyFromUsersObject: "John Doe"
...

但我无法在文档中找到任何示例,当我有这样的结构时,如何通过Posts获取所有UserKey

我需要有关如何进行查询来比较这样的嵌套数据的帮助吗?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是保存对用户帖子的引用。像这样:

linfun

因此,当您想要检索用户的所有帖子时,您只需查看用户个人资料中的引用

答案 1 :(得分:0)

我建议另类

users
  uid_0
    name: "Frank"
  uid_1
    name: "Biff"

posts
  post_0
    msg: "some post"
    user_id: "uid_0"
  post_1
    msg: "Another post"
    user_id: "uid_1"

然后一个简单的查询将返回所有uid_0的帖子

let postsRef = root.child("posts")

postsRef.queryOrdered(byChild: "user_id").queryEqual(toValue: "uid_0")
        .observeSingleEvent(of: .value, with: { snapshot in
    print(snapshot)  //prints all of uid_0's posts
})

这避免了收集post id的需要,然后尝试执行类似SQL的查询WHERE Posts.ID in(k1,k2,k3 ...),因为Firebase不直接提供这样的查询。

回复关于如何处理单个帖子有多个用户的后续评论......

posts
  post_0
    msg: "some post"
    users:
      uid_0: true
      uid_1: true
  post_1
    msg: "Another post"
    users:
      uid_1: true
      uid_2: true

获取包含uid_1:true的节点的代码类似,称为deep query或深路径。这是一篇较旧的帖子,但会给你很好的信息。

let postsRef = root.child("posts")

postsRef.queryOrdered(byChild: "users/uid_1").queryEqual(toValue: true)
        .observeSingleEvent(of: .value, with: { snapshot in
    print(snapshot)  //prints all of uid_0's posts
})