2016-05-31 3 views
0

에 대한 쿼리 Parse에서 나는 정확하게 데이터를 수집하기 위해 containedIn 쿼리에 의존했습니다. Parse에서 나는 objectIds의 배열을 가지고 있고 그 id를 가진 모든 객체를 질의했다. 파이어베이스에서도 같은 목표를 달성하고자합니다.containingIn Firebase

데이터를 병합하는 것이 중요하다고 생각하지만이 문제에 어떻게 도움이되는지는 알지 못합니다. 그 안에 사용자 목록이있는 대화방이 있다고 가정 해 봅시다. 나는 그 데이터를 수집하고 사용자 이름의 배열을 가지고있다. 이제 데이터베이스의 사용자로 이동하여이 사용자 이름 배열 내의 하나의 요소와 일치하는 모든 것을 검색하고 싶습니다. 이렇게하면 어떻게 할 수 있습니까? 예를 들어

, 공식적인 중포 기지 예에서 사용자 집합 :

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

나는 다음과 같은 사용자를 다운로드 쿼리를 수행하고 싶습니다 : 일반적인 대답이 될 것 동안

["alovelace", "eclarke"] 

도움이되면, 스위프트에서의 답이 가장 좋을 것입니다. 고맙습니다.

+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 

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 
    } 
}) 
채팅방 (42) (난봉꾼, eclarke)에서 사용자의 상세한 사용자 노드를 얻으려면

프랭크가 다음 사용자를 얻으려면 (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 노드와 아무것도하지 않았지만 관계를 유지하기 위해주의

편집 님의 질문에 답변

각 사용자들은 다음과 같다 대신, alovelace 빌과 솔직한 다음하는 사용자에게이 구조

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

을 다음 누가 누구를 보여주기에 대한 소감, 여기에 구조입니다.

는 솔직한 다음 모든 사용자를 얻으려면 : 귀하의 코멘트에서

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 -> [followsBy]'대신에'user -> [following]'가되어서는 안 될까요? 이를 수용하기 위해 데이터를 어떻게 재구성 하시겠습니까? – Acoop

+0

데이터를 구성하는 방법에는 여러 가지가 있습니다. '및 현재 사용자가 따르고 있습니다.'라고 물어 보았으므로 사용자 추종자를 표시하도록 구조를 만들었습니다. 주위를 뒤집어서 사용자가 누구를 따르고 있는지 또는 둘 다 표시 할 수 있습니다! 내 업데이트 답변을 참조하십시오. – Jay

+0

지속적인 도움을 가져 주셔서 감사합니다. 그러나 나는 여전히 다음 _ 사용자에 포함 된 사용자의 모든 프로필을 다운로드하는 것이 어떻게 가능할 지 이해하지 못합니다. Frank를 따르는 모든 사용자를 수집하는 대신 follow_user에 포함 된 모든 사용자를 수집하려고합니다. 예를 들어 bill과 frank를 반환하는 쿼리를 작성하십시오. – Acoop

관련 문제