【问题标题】:How to query Firebase database object when criteria property is nested?嵌套条件属性时如何查询 Firebase 数据库对象?
【发布时间】:2017-01-02 14:21:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以当我从用户对象中获取所有密钥时,这意味着我需要再次请求从帖子中获取所有帖子,对吗?
    • 可以,但是您可以限制帖子的数量。如果用户想要更多,获取 10 个帖子引用并使用分页,是一个很好的解决方案
    • 好的,最后一个子问题......在firebase中我可以进行查询,我可以在其中传递我想要返回的键列表......就像在SQL WHERE Posts.ID in (k1 , k2, k3...)?
    • 我认为这两个视频有几个很好的例子。我认为第二个视频回答了您的问题,但请同时观看,因为它们很容易理解:#1:youtube.com/watch?v=sKFLI5FOOHs 和 #2:youtube.com/watch?v=Idu9EJPSxiY
    【解决方案2】:

    我会建议一个替代方案

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

    这避免了收集帖子 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
    })
    

    【讨论】:

    • 嗨,谢谢,但是当帖子可以有多个用户时,我该如何应用这个设计。一篇文章中必须包含用户列表。这就是为什么我创建用户子它是一个列表。
    • @1110 我假设你的意思是帖子可以有多个用户观看帖子?如果是这样,我更新了我的答案来处理这个问题。接受的答案没有错,我只是想提供一个替代方案。
    • 我更喜欢这种方法,但它根本行不通。快照始终为空。
    • 基于您添加的第二个设计(评论后)如何编写查询以返回“uid_1”的所有帖子?
    • 这返回我 null: ref.child("posts").child("users").queryOrdered(byChild: "-KXFrbzxUwaBGjtmjfGr") .observeSingleEvent(of: .value, with: { snapshot在打印(快照)})
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多