0

私はFireBaseを初めて使いました。単純なデータベースを設定しようとしています。ここに私のデータがあります:AngularFire2 - 配列によるフィルタリスト

{ 
    "employees" : { 
    "employee1" : { 
     "name" : "Anthony" 
    }, 
    "employee2" : { 
     "name" : "John", 
     "reviews" : { 
     "review1" : true, 
     "review2" : true, 
     "review3" : true 
     } 
    } 
    }, 
    "leaders" : { 
    "leader1" : { 
     "company" : "Strawberry", 
     "name" : "Martin", 
     "reviews" : { 
     "review1" : true 
     } 
    }, 
    "leader2" : { 
     "company" : "Blueberry", 
     "name" : "Carlos", 
     "reviews" : { 
     "review2" : true, 
     "review3" : true 
     } 
    }, 
    "leader3" : { 
     "company" : "Greenberry", 
     "name" : "Peter" 
    } 
    }, 
    "reviews" : { 
    "review1" : { 
     "comment" : "Test1", 
     "date" : "Thu Jul 06 2017 14:00:51 GMT+0200 (CEST)" 
     }, 
     "review2" : { 
     "comment" : "Test2", 
     "date" : "Thu Jul 06 2017 14:00:51 GMT+0200 (CEST)" 
     }, 
     "review3" : { 
     "comment" : "Test3", 
     "date" : "Thu Jul 06 2017 14:00:51 GMT+0200 (CEST)" 
     } 
    } 
    } 
} 

は、私は次の機能が欲しい:

  1. 投資家
  2. のレビューは、従業員によって書かれたレビューは、

私の質問は以下の通りゲット

  • Is私のデータ構造は正しく、私の機能のニーズに応じて?
  • 機能の実行にはどのようなクエリを使用しますか?私は最初にリーダーオブジェクトを取得し、次にリーダレビュー配列に基づいて何らかのフィルタを使ってレビューを取得することを考えました。
  • リーダーと関連するレビューをすべて1つのクエリで取得することができれば、それは素晴らしいことです。

例として、leader1のレビューを取得したいとします。

db.object('/leaders/leader1').subscribe(res => { 
     this.leader = res; 

//THIS IS THE PROBLEM: GET REVIEWS ON LEADER 
     db.list('/reviews', { 
      query: { 
      equalTo: this.investor.reviews 
      } 
     }).subscribe(queriedList => { 
      this.reviews = queriedList 
     }); 
    }); 

ありがとうございます。

import { Component, OnInit } from '@angular/core'; 
import { AngularFireAuth } from 'angularfire2/auth'; 
import { AngularFireDatabase, FirebaseListObservable, FirebaseObjectObservable } from 'angularfire2/database' 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html' 
}) 
export class AppComponent implements OnInit{ 
    reviews: Array<FirebaseObjectObservable<any[]>> = []; 

    constructor(private fAuth: AngularFireAuth, private db: AngularFireDatabase) { } 

    ngOnInit() { 
    this.fAuth.authState.subscribe(user => { //check if the user is logged in if you don't care about it you can remove this 
     this.db.object('/leaders/leader1').subscribe(leader => { 
     this.reviews = Object.keys(leader.reviews).map(r => db.object('/reviews/' + r)) 
     }) 
    }) 
    } 
} 

その後、あなたのテンプレートを使用すると、レビューをこのようにリストアップできます:あなたはleader1のレビューをこのように得ることができる

+0

アドバイスの私の作品あなたには、「私です私の機能のニーズに応じて、正しいデータ構造ですか?このタイプの質問は、ここでstackoverflow上のトピックオフです。あなたの本当の問題は何ですか?今あなたの質問は広すぎます。 "質問を編集して、適切な回答を特定するのに十分な詳細で特定の問題に限定します。複数の異なる質問を一度に避ける[How to Ask](https://stackoverflow.com/help/how-この質問を明確にするための助けを求めるページ」を参照してください。 –

+0

Fabioに応答する時間をとってくれてありがとう。私は、データ構造がStack Overflowで答えることを許されていないことを知らなかったので、私はそれを謝ります。しかし、データ構造の質問を削除すると、質問は1つしか残っていません - 機能を実行するためにどのようなクエリを使うべきですか?私の質問に答えるために欠けていることがあれば教えてください。 –

+0

データ構造についてではなく、 "xが正しい"か "私はYを行ったか"という質問は、この最良の方法ですか? –

答えて

0

<ul> 
    <li *ngFor="let review of reviews">{{ (review | async)?.comment }}</li> 
</ul> 
+0

時間をいただきありがとうございました。私は1と1をフェッチするように、それがスケールアップするときのパフォーマンスが心配です。これについてあなたの考えは何ですか?良い一日を過ごしてください! –

+0

@MartinBrandhaug Firabaseには2つの最適化がありますが、この質問を読んでください。私はそれがiOSだと知っていますが、JSには有効ですhttps://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse –

関連する問題