来自Parse,我非常依赖containedIn
查询来收集正确的数据。在Parse中,我可能有一个objectIds
数组,并查询具有这些id的所有对象。我希望在Firebase上实现相同的目标。
我知道扁平化数据非常重要,但我不知道这对问题有何帮助。假设我有一个聊天室,里面有一个用户列表。我收集这些数据,现在有一组用户名。我现在想导航到数据库中的用户并检索与此username数组中的一个元素匹配的所有内容。我怎样才能完成这样的事情?
例如,官方Firebase示例中的一组用户:
{
"users": {
"alovelace": { ... },
"ghopper": { ... },
"eclarke": { ... }
}
}
我想执行查询以下载以下用户:
["alovelace", "eclarke"]
虽然一般性答案会有所帮助,但Swift中的答案最好。谢谢。
答案 0 :(得分: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(lovelace,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
}
})
让弗兰克跟随的用户(lovelace,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遵循法案和坦诚。
让所有用户关注frank:
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)
}
})