web-dev-qa-db-ja.com

Cloud Firestoreで論理ORを使用して複合クエリを実行するにはどうすればよいですか?

ドキュメント から:

複数のwhere()メソッドを連鎖させて、より具体的なクエリを作成することもできます(論理AND)。

ORクエリを実行するにはどうすればよいですか?例:

  1. フィールドstatusopen OR upcoming
  2. フィールドstatus == open OR createdAt <= <somedatetime>
23
ProblemsOfSumit

ORは、サーバーがスケーリングするのが難しいため、サポートされていません(状態をdedupに維持する必要があります)。回避策は、条件ごとに1つのクエリを2つ発行し、クライアントで重複除去することです。

15
Dan McGrath

「ステータス」フィールドはありませんが、ステータス関連のフィールドは、リクエストに基づいてtrueまたはfalseに更新します

{ name: "a", status_open: true, status_upcoming: false, status_closed: false}

ただし、Firebase Cloud Functionsを確認してください。次のようなステータス関連のプロパティを更新する、ステータスの変更をリッスンする機能を使用できます

{ name: "a", status: "open", status_open: true, status_upcoming: false, status_closed: false}

どちらか、あなたのクエリはちょうど

...where('status_open','==',true)...

それが役に立てば幸い。

2
norgematos

rxjsマージ演算子を使用して2つのObservableをバインドできます。ここに例を示します。

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/merge';

...

getCombinatedStatus(): Observable<any> {
   return Observable.merge(this.db.collection('foo', ref => ref.where('status','==','open')).valueChanges(),
                           this.db.collection('foo', ref => ref.where('status','==','upcoming')).valueChanges());
}

次に、上記の方法を使用して、新しいObservable更新をサブスクライブできます。

getCombinatedStatus.subscribe(results => console.log(results);

これがあなたのお役に立てば幸いです、チリからのご挨拶!!

2

ステータスにも価値を与えることを提案します。
例.

_{ name: "a", statusValue = 10, status = 'open' }

{ name: "b", statusValue = 20, status = 'upcoming'}

{ name: "c", statusValue = 30, status = 'close'}
_

ref.where('statusValue', '<=', 20)でクエリを実行すると、_'a'_と_'b'_の両方が見つかります。

これにより、クエリのコストとパフォーマンスを節約できます。

ところで、すべてのケースを修正するわけではありません。

1

ちょうど今、同じ問題があります。幸いなことに、可能な値はA、B、C、D(4)だけなので、A || B、A || C、A || B ||のようなものを照会する必要があります。 C、Dなど


数ヶ月前のように、firebaseは新しいクエリarray-containsをサポートしているので、配列を作成し、OR値を配列に事前処理します

if (a) {
array addObject:@"a"
}
if (b) {
array addObject:@"b"
}
if (a||b) {
array addObject:@"a||b"
}
etc

そして、すべての4!値または多くのコンボが存在する場合でもこれを行います。

その後、クエリ[document arrayContains:@"a||c"]または必要な条件の種類を簡単に確認できます。

したがって、4つの条件(A、B、C、D)の条件付きAにのみ限定されるものがある場合、その配列には次のリテラル文字列が含まれます。@["A", "A||B", "A||C", "A||D", "A||B||C", "A||B||D", "A||C||D", "A||B||C||D"]

次に、これらのORの組み合わせについては、必要に応じてarray-containsを検索できます(例: "A || C")


注:これは、ORと比較する可能性のある値がいくつかある場合にのみ、合理的なアプローチです。

Array-contains here の詳細は、firebase docsに新しいので

1
Albert Renshaw