Firebase 3 - 多对多关系...无法获得它

时间:2016-11-11 15:30:46

标签: angular firebase ionic2 angularfire2

我对Firebase相对较新,以及随之附带的新查询API。

基本上,我有一个数据存储设置,用户可以在其中添加他们在个人资料中展示的YouTube视频。由于用户可以拥有许多视频和视频可以包含许多用户,因此我尝试根据最佳做法以适当的方式构建数据存储,如下所示:

{
    users {
     c25zdGFyb3NjaWFrQGdtYWlsLmNvbQ==
       videos {
         AFA-rOls8YA: true,
         AlLsp4gnyDQ: true,
         dX_1B0w7Hzc: true,
         ik5qR5bw75E: true,
         njos57IJf-0: true
       },
       videos {
         AFA-rOls8YA {
           attached_members {
             c25zdGFyb3NjaWFrQGdtYWlsLmNvbQ==: true
           }
           title: "Hello...it's me"
         },
         AlLsp4gnyDQ: { ... },
         dX_1B0w7Hzc: { ... },
         ik5qR5bw75E: { ... },
         njos57IJf-0: { ... },
         zn7-fVtT16k
        }
      }
    }
}

我可以做什么来查询这些对象,以便我可以找回一个如下所示的单个用户:

c25zdGFyb3NjaWFrQGdtYWlsLmNvbQ: {
  videos: {
     AFA-rOls8YA: {
       attached_members: { ... }
       title: "Hello...it's me"
     },
     AlLsp4gnyDQ: { ... },
     dX_1B0w7Hzc: { ... },
     ik5qR5bw75E: { ... },
     njos57IJf-0: { ... },
     zn7-fVtT16k: { ... }
  }
}

我有很多情况需要这样的事情发生。我目前正在使用Ionic 2,AngularFire 2,但如果需要可以使用原生Javascript SDK。我看到很多关于以这种方式构建数据的帖子,但是我没有看到这些帖子直接回答如何以最优化的现代方式使用Firebase 3来获取它。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

因此他们取消分割的原因是能够在不加载大量数据的情况下绑定到端点。如果在加载该节点时在单个节点下拥有所有数据,则会获得整个树。

我们经常做你想做的事情,但这不是一次查询。

我看到两个主要选项,

一:对结果进行大循环的功能:

public getUser(userKey: string) {
  // assumes using af2
  return this.af.database.object('path/to/users/' + 'userKey').map((user) => {
    for ( let vidKey in user.videos) {
      if (user.videos.hasOwnProp(vidKey)) {
        this.af.database.object('path/to/vids/' + vidKey).map((video) => {
          user.videos[vidKey] = video;
        });
      }
    }
    return user;
  });
};

这会将您的用户作为对象加载,然后加载每个视频并在加载数据时更新对象。现在我只使用这个方法,如果你真的需要一个大对象,但我想你只想在用户列表中显示它,然后详细介绍每个视频:

选项2:较小的功能

TS:

// before constructor
public user = this.getUser('1234');

//after constructor
public getUser(userKey: string) {
  return this.af.database.object('path/to/users/' + userKey);
}
public getUserVids(userKey: string) {
 return this.af.database.list('path/to/users/' + userKey + '/videos');
}
public getVideo(vidKey: string) {
  return this.af.database.object('path/to/vids/' + vidKey);
}

在模板中:

<div class="user" *ngIf="user">
    <h3>Name: {{user.name}}</h3>
    <div class="video" *ngFor="let video of geUserVids(user.$key) | async">
        <p>title: {{video.title}}</p>
        <p>length: {{video.length}}
    </div>
</div>

这种方式要小得多,功能可以在不同的地方使用。这使用从AF2返回的observables,但可能是你真正想做的,而不是一个巨大的json对象...