containsIn查询Firebase

时间:2016-05-31 17:05:13

标签: ios swift firebase

来自Parse,我非常依赖containedIn查询来收集正确的数据。在Parse中,我可能有一个objectIds数组,并查询具有这些id的所有对象。我希望在Firebase上实现相同的目标。

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

例如,官方Firebase示例中的一组用户:

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

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

["alovelace", "eclarke"]

虽然一般性答案会有所帮助,但Swift中的答案最好。谢谢。

1 个答案:

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