2017-02-21 25 views
1

Firebaseデータベースには、の予約があります。です。複数の場所を使用してFirebaseデータベースから選択

{ 
    userUid: string, 
    status: string, 
    moreStuff: { 
    .... 
    } 
} 

私は特定のユーザに関連付けられたすべての予約を選択する必要があり、以下の構造として、各予約(すなわち、そのuserUidあるユーザのUIDに等しいです。 (例えば、status = confirmed)を持っています。

私は次のクエリ

db.list('bookings', { 
     query: { 
      orderByChild: 'userUid', 
      equalTo: user.uid 
     } 
    }) 

を使用して、特定のユーザーに属する予約を選択することができますが、私は、例えば、追加の選択条件を追加することができれば、私は考えていますstatus = confirmed

+0

Firebaseデータベースクエリは、1つのプロパティに対してのみ順序付け/フィルタリングできます。 1つのプロパティでフィルタリングする値を組み合わせることができます。 http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebaseを参照してください。あるいは、クエリを許可するようにデータをモデル化することもできます。たとえば、これは一見したところカテゴリ化の問題のようですが、ここで取り上げています:http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

答えて

1

firebaseクエリでは、複数のフィールドでフィルタリングすることはできません。私はこの制限に何度も遭遇しました。

データをモデル化すると、あなたの課題はより簡単になります。ユーザーと予約の間には1対1の関係があると私は信じています。すなわち、ユーザは多くの予約をすることができるが、予約は1人のユーザしか持たない。この場合、各ユーザーの個別の予約リストを含むトップレベルノード "bookingLists"を作成します。その構造を以下に示す。 "bookingList/< userId>"のパスには、特定のユーザーの予約リストが含まれています。 userIdを知っていればリストにアクセスできます。そのユーザーのすべての予約が含まれます。次に、各予約の1つのフィールドで照会してフィルターをかけることができます。

bookingLists 
    <userId> 
    bookings 
     <bookingKey> 
      status 
      ...other fields 

さらに予約をフィルタリングする必要がある場合は、観察可能な操作マップとフィルタを使用してクライアント側でフィルタすることができます。これは、各ユーザの予約リストがあまりにも大きくない限り、拡大縮小されます。

+0

ありがとう。クリアしかし、追加の質問です。中規模から複雑なアプリケーションでFirebaseを使用するために、フィルタの1つのフィールドの制限が制限の大部分になっていませんか?私の場合、あなたが提案した解決策はうまくいきますが、基準を変更した場合(たとえば、私が特定の月の '保留中'の予約をしたい場合)、クライアント側でフィルタリングする必要があります。 – Picci

+1

はい、大きな限界です。しかし、フィールドの組み合わせやクライアント側のフィルタリングなどの回避策があります。しかし、それはまだ非常に不便です。しかし、Firebaseチームによれば、実際のスケーリングのための必要条件です。私の場合、Firebaseはスケーリングのためではなく、主にそのリアルタイム性とサーバレスモデルのために使用されています。私は限界と一緒に暮らすことができることを知りました。 –

関連する問題