2016-11-11 6 views
0

Firebaseとそれに付随する新しいQuery APIについて比較的新しいです。Firebase 3 - 多対多リレーションシップ...かなり得られない

基本的に、ユーザーが自分のプロフィールに紹介する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を使って、現代的に最適化された方法で直接投稿することはできません。

どのようにするか考えていますこの?

+0

同時にすべてのデータを必要とする理由はありますか? – ksav

+0

ええ、関連するすべてのビデオコンテンツを表示する必要があるプロファイルページを表示します。 –

答えて

1

だから、彼らがあなたを疎外させた理由は、大量のデータをロードせずにエンドポイントにバインドできることです。そのノードをロードしたときに単一のノードの下にすべてのデータがあると、ツリー全体が取得されます。

私たちはあなたが頻繁にやろうとしていることはしていますが、1回の問い合わせではありません。私は2つの主要なオプションを参照してください

ワン:関数は、結果の上に大きなループを行うには:これはオブジェクトとしてユーザーをロードし

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

その後、各ビデオをロードし、データがロードされたときにオブジェクトを更新します。今、あなたは実際には1つの大きなオブジェクトを必要とする場合、私はこの方法だけを使用したいが、私はあなただけで、その後、各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オブジェクトではありません。

+0

Dennisの簡潔な回答をありがとうございました。ここでは、最初の選択肢は実際には私が必要としているもののラインに沿っているということです。なぜなら、モバイルアプリでユーザーのプロファイル画面を構築しているからです。あなたが書いたもののような関数を作成していることがわかりましたが、その結果を購読すると、実際のビデオを取得するためにネストされたforループオブジェクトの呼び出しをヒットしないようです。この例では、サブスクライブで何か不思議なことはありますか?または、私のコンポーネントがどのように見えるかの例を教えてください。 –

+0

私はあなたが少なくとも2つの呼び出しメソッドを試して、ユーザーを読み込み、次にvidsをロードする必要があると思う。しかし、私の呼び出しに応答するには、私はマッピングしているので、マップの結果を返します。ネストされたオブザーバブルが必要な場合はflatMap()を試すこともできます –

関連する問題