首页 文章

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

提问于
浏览
1

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

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

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

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

2 回答

  • 0

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

    root
     - Users
       - [UserID]
          - UserPosts
            -K_54s1smPPh6qN4znuT
     - Posts
       - -K_54s1smPPh6qN4znuT
         - key1: val
         - key2: val
         - User:
           - -K_54sSomeKeyFromUsersObject: "John Doe"
    ...
    

    因此,当您想要检索用户的所有帖子时,只需查看用户配置文件上的引用即可

  • 1

    我会建议一个替代方案

    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
    })
    

相关问题