2016-06-25 14 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 = "user id"

firebaseの内部結合に似た何かを知っている人はいますか?

どうもありがとう、 Yacine

+0

私の答えでちょっとした更新がありました。それが役に立つかどうか私に教えてください。 :) – adolfosrs

+1

また、あなたのデータ構造をわずかに変更し、各ユーザオブジェクト内にノードを持ち、そのノード内にIDが保持しているすべての投稿にIDを保持することもできます。ポストのIDをキーとして保存するだけで、その値を真にすることができます。 – DogCoffee

+0

DogCoffeeにもフィードバックしていただきありがとうございます。 – Yacine

答えて

3

あなたは、ネストされたfirebase呼び出しで作業する必要があります。あなたはjavascript example in this questionを見つけることができますが、あなたのSWIFTコードは、次のようになります。

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" : { 
    "-KIycKhZU55dmKnHbbxv" : { 
     "author" : "John Doe", 
     "body" : "This is a post test", 
     "title" : "test", 
     "uid" : "SHaH36BLwgPvwgi9cDmRnsnONFB2" 
     "commented_by" 
      "SHaH36BLwgPvwgi9cDmRnsnONFB2": true 

を検討する必要があります次に、あなたは、単に

posts.child("commented_by/uid").queryEqualToValue(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

関連する問題