web-dev-qa-db-fra.com

Comment effectuer des requêtes composées avec logique OR dans Cloud Firestore?

De les docs :

Vous pouvez également chaîner plusieurs méthodes where () pour créer des requêtes plus spécifiques (AND logique).

Comment effectuer une requête OR? Exemple: 

  1. Donnez-moi tous les documents où le champ status est open OR upcoming
  2. Donnez-moi tous les documents où le champ status == open OR createdAt <= <somedatetime>
17
ProblemsOfSumit

OR n'est pas pris en charge car il est difficile pour le serveur de la mettre à l'échelle (nécessite de conserver l'état pour la dédu). La solution consiste à émettre deux requêtes, une pour chaque condition, et une déduction sur le client.

12
Dan McGrath

Je n'aurais pas de champ "status", mais des champs liés au statut, les mettant à jour en true ou false sur demande 

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

Cependant, vérifiez les fonctions de Cloud Firebase. Vous pouvez modifier l’état d’écoute d’une fonction et mettre à jour les propriétés liées à l’état telles que

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

l'un ou l'autre, votre requête pourrait être juste

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

J'espère que ça aide.

2
norgematos

vous pouvez lier deux observables à l'aide de l'opérateur de fusion rxjs . Vous avez ici un exemple.

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

Ensuite, vous pouvez vous abonner aux nouvelles mises à jour Observable en utilisant la méthode ci-dessus:

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

J'espère que cela pourra vous aider, salutations du Chili !!

0
Fernando Gutiérrez

suggère de donner une valeur au statut aussi.
ex.

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

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

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

vous pouvez interroger par ref.where('statusValue', '<=', 20) puis 'a' et 'b' seront trouvés.

cela peut économiser les coûts et les performances de votre requête.

par ailleurs, il n'est pas résolu tous les cas.

0