2016-05-31 106 views
0

来自Parse,我主要依靠containedIn查询来收集正确的数据。在解析中,我可能有一个objectIds的数组,并用这些ID查询所有对象。我期望在Firebase上实现同样的效果。containedIn查询Firebase

我明白平坦化数据非常重要,但我不明白这对问题有何帮助。假设我有一个聊天室,里面有用户列表。我收集这些数据,现在有一组用户名。我现在想导航到数据库中的用户并检索与此用户名数组中的一个元素匹配的所有内容。我怎样才能完成这样的事情?

例如,在一个正式的火力地堡例如一组用户:

{ 
    "users": { 
    "alovelace": { ... }, 
    "ghopper": { ... }, 
    "eclarke": { ... } 
    } 
} 

我想执行一个查询下载以下用户:

["alovelace", "eclarke"] 

虽然一般的答案是有帮助的,Swift中的答案是最好的。谢谢。

+0

从您的意见,我想你明白我的问题,但我做了一个例子,使其更清楚。 – Acoop

+0

用户lovelace和eclarke之间的关系是什么?即什么使得这两个用户节点重要?加载节点非常简单,但要了解为什么您希望对Firebase的结构至关重要。 – Jay

+0

一个例子是他们是聊天室的两个成员。或者当前用户正在关注他们。 – Acoop

回答

1

一个例子是他们是聊天室的两个成员。或者当前用户正在关注他们。

所以理论上用户节点

users 
    alovelace 
     followed_by 
     bill: true 
     frank: true 
     in_chat_room: room_42 
     location: France 
    ghopper 
     followed_by 
     jay: true 
     in_chat_room: room_27 
     location: USA 
    eclarke 
     followed_by 
     frank: true 
     in_chat_room: room_42 
     location: Canada 

和一些聊天室

chat_rooms 
    room_27 
    ghopper: true 
    room_42 
    lovelace: true 
    eclarke: true 

要获得用户的详细用户节点在聊天室42(洛夫莱斯,eclarke)

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("in_chat_room").queryEqualToValue("room_42") 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let location = child.value["location"] as! String 
     print(location) //prints France and Canada 
    } 
}) 

要获得用户Frank正在关注(lovela CE,eclarke):

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("followed_by/frank").queryEqualToValue(true) 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let userName = child.key as String 
     print(userName) 
    } 
}) 

注意,使用用户名作为节点关键的通常是一个坏主意 - 他们应该用他们的UID存储。

另外请注意,我们并没有真正做任何与chat_rooms节点,但维持的关系,具有节点相互引用可观察的变化等有用

编辑:

回应评论,这里的结构,为每一位用户表示他们遵循谁代替谁是跟随用户

users 
    alovelace 
     following_user 
     bill: true 
     frank: true 
     in_chat_room: room_42 
     location: France 

这种结构,alovelace是继比尔和坦诚。

要得到所有用户的下列坦率地说:

let usersRef = self.myRootRef.childByAppendingPath("users") 

usersRef.queryOrderedByChild("following_user/frank").queryEqualToValue(true) 
    .observeEventType(.Value, withBlock: { snapshot in 
    for child in snapshot.children { 
     let userName = child.key as String 
     print(userName) 
    } 
}) 
+0

这对我来说似乎有点凌乱。为什么用户需要存储所有其他正在关注他们的用户?对于每个用户来说,它是否更清洁(更简单)来存储他们关注的人?而不是'user - > [followedBy]'不应该是'user - > [following]'?你将如何重组数据以适应这种情况? – Acoop

+0

结构化数据的方式有很多种 - 您曾询问过'当前用户是否关注他们',因此我将其结构化以显示用户关注者是谁。你可以翻转,并显示一个用户正在关注的人 - 或两者兼而有之!看到我更新的答案。 – Jay

+0

感谢您继续提供帮助。但我仍不明白如何下载following_user中包含的所有用户配置文件。我不想收集所有跟随Frank的用户,而是希望收集following_user中包含的所有用户。例如,创建一个可以返回bill和frank的查询。 – Acoop