2016-12-07 35 views
1

我试图做一个与firebase的示例应用程序,我不太明白我应该如何检索嵌套受宠若惊的数据。加入不同的节点,立即观察它们与火力点

让我们假设我有这样

{ 
     "users": { 
      "user-1": { 
       "email": "email1", 
       "matches": [ 
        "match-1", 
        "match-2" 
       ] 
      }, 
      "user-2": { 
       "email": "email2", 
       "matches": [ 
        "match-1", 
        "match-2" 
       ] 
      }, 
      "user-3": { 
       "email": "email3", 
       "matches": [ 
        "match-2" 
       ] 
      } 
     }, 
     "matches": { 
      "match-1": { 
       "name": "Match 1", 
       "users": [ 
        "user-1", 
        "user-2" 
       ] 
      }, 
      "match-2": { 
       "name": "Match 2", 
       "users": [ 
        "user-1", 
        "user-2", 
        "user-3" 
       ] 
      } 
     } 
    } 

分贝,我想获得用户1的所有比赛。 我现在正在做的是观察users.user-1.matches拿到比赛名单,然后观察每场比赛,因此最终流程是:

  • 观察users.user-1.matches
  • 观察matches.match-1
  • 观察matches.match-2
  • ...

的问题是:如何优化这个流程? (喜欢做的东西像SQL JOIN)

我的想法是让这样的事情

{ 
    "users": { 
     "user-1": { 
      "email": "email1", 
      "matches": { 
       "match-1": { 
        "name": "Match 1", 
        "users": [ 
         "user-1", 
         "user-2" 
        ] 
       }, 
       "match-2": { 
        "name": "Match 2", 
        "users": [ 
         "user-1", 
         "user-2", 
         "user-3" 
        ] 
       } 
      } 
     } 
    } 
} 

,所以我可以观察整个结构的一次。

我在iOS上使用的是firebase,但可随时用您喜欢的任何语言回复。

谢谢。

+0

请参阅http://stackoverflow.com/questions/40783240/firebase-in-clause-query-and-lists-of -datas/40808561#40808561(通过[搜索firebase swift提及'join'](http://stackoverflow.com/search?q=%5Bfirebase%5D%5Bswift%5D+join))。 –

回答

2

在评论中链接的答案是一个答案,但让我们简化。让我们创建一个用户节点存储用户和一个相匹配的节点来跟踪他们在打比赛

然后,我们会做一个查询,检索的匹配用户-1发挥:

users 
    user-1 
    name: "some name" 
    email: "[email protected]" 
    user-2 
    name: "another name" 
    email: "[email protected]" 
    user-3 
    name: "cool name" 
    email: "[email protected]" 

和那么相匹配的节点

matches 
    match-1 
    name: "Match 1" 
    users 
     user-1: true 
     user-2: true 
    match-2 
    name: "Match 2" 
    users 
     user-1: true 
     user-2: true 
     user-3: true 
    match-3 
    name: "Match 3" 
    users 
     user-2: true 
     user-3: true 

正如你可以看到,我们已经构建的数据库架构直接解决我们的查询

matchesRef.queryOrdered(byChild: "users/user-1").queryEqual(toValue: true) 
         .observe(.value, with: { snapshot in 
    print(snapshot)   
}); 

并且快照将包含节点match-1和match-2但不匹配-3

+0

与您的解决方案我能够从用户中删除匹配参考。现在我为每个用户都有一个匹配列表,但是,我必须单独观察玩家以获得他们的属性。 (例如:姓名,电子邮件..) – Gnammo

+0

@Gnammo对。但。无论如何,您都需要分别访问该玩家数据。例如,假设您在tableView中向用户显示玩家列表。该视图显示了用户可以点击或点击以查看他们所玩的匹配的玩家。初始玩家名单必须来自某处,因此当您最初加载玩家时,还要将其他相关数据保留在tableviewDatasource数组中。当用户点击玩家时,你知道他们的用户(用户1等),然后可以查询该玩家匹配的匹配。 – Jay

+0

好的,我有最后一个问题:我可以根据其他属性过滤匹配吗?我试着'matchesRef.queryOrdered(byChild:“users/user-1”)。queryEqual(toValue:true).queryEqual(toValue:“some name”,childKey:“name”)''但它会导致崩溃,因为“不能调用queryEqualToValue:childKey:在queryStartingAtValue之后,queryEndingAtValue或queryEqualToValue之前被称为” – Gnammo