Firebase 3 - 多对多关系...不太明白



我对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。

对如何做到这一点有什么想法吗?

所以他们让你取消隔离的原因是能够绑定到端点而不加载大量数据。如果你把所有的数据放在一个节点下,当你加载这个节点时,你会得到整个树。

我们做你经常尝试做的事情,但它不是一个单一的查询调用。

我看到两个主要选项,

一:对结果进行大循环的函数:

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

这将加载用户作为对象,然后加载每个视频并在加载数据时更新对象。我只会在需要一个大对象的情况下使用这个方法但我认为你只需要在用户列表中显示它,然后在每个vid上显示详细信息:

选项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返回的可观察对象,但可能是你真正想做的,而不是一个巨大的json对象…

最新更新