2017-01-02 79 views
1

我在火力地堡数据库的结构如下:如何在条件属性嵌套时查询Firebase数据库对象?

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

但我不能在我的文档怎么才能获取所有Posts通过UserKey当我有结构这样狼狈不堪的例子。

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

回答

1

解决此问题的一种方法是将引用保存到用户上。就像这样:

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

所以,当你想要检索由用户的所有帖子,你只要看看用户配置文件中引用

+0

因此,当我从用户对象获得所有密钥时,这意味着我需要提出另一个请求以获取帖子中的所有帖子对吗? – 1110

+0

是的,但是你可以限制帖子的数量。如果用户想要更多的话,获得10篇对帖子的引用和使用一个页面,这是一个很好的解决方案 –

+0

好的,只是最后一个子问题...在firebase中我可以做一个查询,我可以通过我想要返回的密钥列表。 ..就像在SQL WHERE Posts.ID in(k1,k2,k3 ...)? – 1110

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

这样就避免了需要收集然后尝试在(k1,k2,k3 ...)中的WHERE Posts.ID中执行类似SQL的查询,因为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节点:真的是类似的,称为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 
}) 
+0

嗨,谢谢,但我可以如何应用这种设计时,帖子可以有多个用户。一个职位必须有一个用户列表。这就是为什么我创建用户的孩子,它是一个列表。 – 1110

+0

@ 1110我假设你的意思是帖子可以有多个用户在看帖子?如果是这样,我更新了我的答案来处理这个问题。接受的答案没有错,我只是想提供一个替代方案。 – Jay

+0

我更喜欢这种方法,但它根本行不通。快照始终为空。 – 1110