2016-06-25 7 views
3

FIRDatabaseQuery 개체에서 내부 조인을 수행하려고합니다.FIRDatabaseQuery : 내부 조인을 수행하는 방법

아래의 데이터베이스 구조입니다. 게시물 덧글에 연결된 일부 게시물이 있습니다. 이것은 내부로 번역됩니다 SQL에

{ 
    "posts" : { 
    "-KIycKhZU55dmKnHbbxv" : { 
     "author" : "John Doe", 
     "body" : "This is a post test", 
     "title" : "test", 
     "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
    }, 
    "-KIyg_ks1O5QL4_4dfq_" : { 
     "author" : "Jane Doe", 
     "body" : "This is a post test", 
     "title" : "test2", 
     "uid" : "x5leSBGArnd10JilD9YDyNBNfZ03" 
    },... 
    } 
    "post-comments" : { 
    "-KIycKhZU55dmKnHbbxv" : { 
     "-KIycMyL0Vy1BHVdI4zc" : { 
     "author" : "toto", 
     "text" : "test", 
     "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
     }, 
     "-KIyg_ks1O5QL4_4dfq_" : { 
     "author" : "toto", 
     "text" : "test", 
     "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
     } 
    },... 
} 

가 쿼리와 유사한 가입 : 포스트 내부에서

선택 * 포스트에 가입 나는 특정 사용자가 댓글을 추가 한 모든 게시물을 얻기 위해 노력하고 있어요 post-id에 대한 의견 post-comments.uid = "사용자 ID"

firebase에서 내부 결합과 비슷한 것을 얻는 방법을 아는 사람이 있습니까?

고마워, 야신 당신은 중첩 된 중포 기지 전화와 함께 작동하도록해야합니다

+0

방금 ​​대답했습니다. 그것이 유용했는지 알려주세요. :) – adolfosrs

+1

데이터 구조를 약간 변경하고 각 사용자 객체 내에 노드를두고 해당 노드 내에 주석이있는 모든 게시물에 대한 ID를 보유 할 수도 있습니다. 게시물의 ID를 키로 저장하면 값이 참일 수 있습니다. – DogCoffee

+0

DogCoffee에 대한 의견을 보내 주셔서 감사합니다. – Yacine

답변

3

. 당신은 javascript example in this question 찾을 수 있지만 빠른 코드는 다음과 같아야

ref.child("posts").observeEventType(.ChildAdded, withBlock: { (snapshot) in 
    if let postId = snapshot.key as! String { 
     let commentsRef = ref.child("post-comments") 
     commentsRef.child(postId).queryOrderedByChild("uid").queryEqualToValue(userId).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      for child in snapshot.children.allObjects as [FDataSnapshot] { 
       print(child.value)  
      } 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
     } 
}) 
+0

코드 관련 문제가 신속하게 발생하면 죄송합니다. 테스트 할 수 없습니다. – adolfosrs

+0

덕분에 많은 Adolfosrs! 이것은 매우 도움이된다 – Yacine

+1

@ Yacine 이것은 데이터베이스의 모든 게시물에 대해 반복을 제안하고 각 질문에 개별적으로 uid를 쿼리하는 것으로 나타납니다. 1,000,000 개의 게시물이있는 경우 시간이 오래 걸릴 수 있습니다. 그리고 데이터베이스가 커질수록 길어지고 오래 걸립니다. – Jay

4
당신은 당신이 단순히

posts.child("commented_by/uid").queryEqualToValue(true) 

또는 변경에 대한 조회 할 수 있습니다 그리고

"posts" : { 
    "-KIycKhZU55dmKnHbbxv" : { 
     "author" : "John Doe", 
     "body" : "This is a post test", 
     "title" : "test", 
     "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
     "commented_by" 
      "SHaH36BLwgPvwgi9cDmRnsnONFB2": true 

을 고려할 수 있습니다

덧글을 올리면 수행 할 검색어와 더 잘 일치 할 수 있습니다.

"post-comments" : { 
    "-KIycMyL0Vy1BHVdI4zc" : { 
    "author" : "toto", 
    "post_data": 
      post_id: "-KIycKhZU55dmKnHbbxv", 
      post_title: "test" 
    "text" : "test", 
    "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
}, 

이렇게하면 주석이 달린 게시물의 모든 post_id를 반환하는 uid에 대해 게시물 주석 노드를 쿼리 할 수 ​​있으므로 쿼리가 신속하게 수행됩니다. 게시물 자체는 반환되지 않지만 제목을 찾고 목록을 채울 수 있습니다. 사용자가 탭하면 실제 데이터를 검색 할 수 있습니다.

+0

좋은 대답 @ 제이 내 대답에 이것을 지적하는 것을 잊어 버렸지 만, 그는 "SQL과 비슷한"내부 쿼리를 수행하는 방법에 대해 질문했기 때문에 그것에 중점을 두었습니다. 그러나 당신 말이 맞습니다. 그는 그의 스키마에 대한 재 설계를 생각해야합니다. – adolfosrs

+0

입력 해 주셔서 감사합니다. Jay! 이는 확장 성 측면을 무시하지 않는 큰 통찰력입니다. 이것을 사용하여 스키마를 다시 작성하겠습니다. – Yacine