2017-01-09 3 views
0

죄송합니다. Firebird에 대한 초보자입니다. 여기 내 샘플 데이터베이스입니다. Firebase 데이터베이스에서 객체 찾기

{ 
    groups:{ 
    #groupid:{ 
     members:{ 
     #userid: 
     } 
     name: 
    } 
    } 
} 

enter image description here

나는 사용자의 그룹을 찾기 위해 노력하고있다. 그룹 이름으로 검색 할 때 데이터를 가져올 수 있습니다.

let lRef = FIRDatabase.database().referenceWithPath("groups") 
    lRef.queryOrderedByChild("name").queryEqualToValue("one").observeSingleEventOfType(.Value, withBlock: { snapshot in 
     print("hello world \(snapshot.value)") 
    }) 

회원의 사용자 ID로 검색 할 수는 없습니다. 누군가 제발이 일을 도와주세요.

+0

나는 쿼리가 작동하지 않는 이유를 즉시 알지 못하므로, 다른 누군가가 그걸 발견하게되기를 바랍니다. 그러나 Firebase가 권장하는 다른 유형의 데이터를 확실히 중첩하고 있습니다. 두 개의 최상위 노드'/ groups/$ groupid'와'/ members/$ groupid'를 생성 한 다음 현재 이들 사이에있는 동일한 데이터를 분할하는 것이 좋습니다. 그것은 쿼리 문제를 해결할 수는 없지만 많은 장래의 두통을 예방할 것입니다. –

답변

1

중첩 된 데이터의 완벽한 예입니다.

Google은이 주제에 대해 documentation을 제공합니다. 그들은 이것을 피하는 것이 좋습니다. 여기

가 인용 한 경우 : 중포 기지 실시간 데이터베이스는 최대 32 개 수준 깊은 중첩 데이터를 수 있기 때문에

피 중첩 데이터

,이 기본되어야한다고 생각하는 유혹 수 있습니다 구조. 그러나 데이터베이스의 한 위치에서 데이터를 가져올 때 모든 하위 노드도 검색합니다. 또한 데이터베이스에있는 노드에서 다른 사람에게 읽기 또는 쓰기 액세스 권한을 부여하면 해당 노드 아래의 모든 데이터에 액세스 할 수있는 권한도 부여됩니다. 따라서 실제로는 데이터 구조를 가능한 한 평평하게 유지하는 것이 가장 좋습니다.

아마도 사용자 메타 데이터로 데이터베이스에 다른 노드가있을 것입니다. 그 users-node는 사용자가 속한 모든 그룹을 포함하는 자식을 가져야합니다. 그러면 사용자가 어느 그룹에 속해 있는지 쉽게 알 수 있습니다.

제가 맞다면 이것은 정확히 무엇입니까? 당신은 성취하려고 노력하고 있습니다.

데이터베이스는/다음과 비슷한 모습이 될 것입니다 것입니다 :

{ 
    groups: { 
    #groupid01: { 
     members: { 
     #userid: true, 
     } 
     name: #groupname01 
    }, 
    #groupid02: { 
     members: { 
     } 
     name: #groupname02 
    } 
    }, 
    users: { 
    #userid01: { 
     groups: { 
     #groupid01: true, 
     #groupid02: true 
     } 
    }, 
    #userid02: { 
     groups: { 
     } 
    }, 
    ...: {}, 
    } 
} 

희망이 도움이!

관련 문제