FIRDatabaseQuery: how to do an inner join

£可爱£侵袭症+ 提交于 2019-12-04 01:42:54

问题


I'm trying to do an inner join on a FIRDatabaseQuery object.

below is the database structure. I have some posts that are linked to post-comments. I am trying to get all the posts that a specific user added a comment on:

 {
   "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"
      }
    },...
 }

in SQL this will be translated into a inner join query similar to:

Select * from post inner join post-comments on post-id where post-comments.uid = "user id"

Does anybody know how o get something similar to an inner join in firebase?

Thanks a lot, Yacine


回答1:


You will need to work with nested firebase calls. You can find a javascript example in this question but your swift code should look like the following:

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



回答2:


You may want to consider

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

Then you can simply query for

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

or, change the post-comments around to better match the queries you want to do:

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

That makes the query a snap as the post-comments node can be queried for the uid which return all of the post_id's of the posts they commented on. It wouldn't return the post itself, however, you may just be looking for the title so you can populate a list. Once the user taps it clicks it you can retrieve the actual data.



来源:https://stackoverflow.com/questions/38033464/firdatabasequery-how-to-do-an-inner-join

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!