database - Come eseguire query composte con OR logico in Cloud Firestore?




firebase google-cloud-platform (4)

Dai documenti :

È inoltre possibile concatenare più metodi where () per creare query più specifiche (AND logico).

Come posso eseguire una query OR ? Esempio:

  1. Dammi tutti i documenti in cui lo status del campo è open O upcoming
  2. Dammi tutti i documenti in cui il campo status == open O createdAt <= <somedatetime>

Abbiamo lo stesso problema proprio ora, per fortuna gli unici valori possibili per i nostri sono A, B, C, D (4), quindi dobbiamo fare una ricerca per cose come A || B, A || C, A || B || C, D, ecc

A partire da qualche mese fa firebase supporta un nuovo array-contains query array-contains quindi ciò che facciamo è creare un array e pre-elaborare i valori OR dell'array

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

E lo facciamo per tutti e 4! valori o comunque molte combo ci sono.

POI possiamo semplicemente controllare la query [document arrayContains:@"a||c"] o qualunque tipo di condizione abbiamo bisogno.

Quindi, se qualcosa si qualificasse solo per la condizione A dei nostri 4 condizionali (A, B, C, D), la sua matrice conterrebbe le seguenti stringhe letterali: @["A", "A||B", "A||C", "A||D", "A||B||C", "A||B||D", "A||C||D", "A||B||C||D"]

Quindi per una qualsiasi di quelle combinazioni OR possiamo solo cercare array-contains su qualsiasi cosa possiamo desiderare (ad esempio "A || C")

Nota: questo è un approccio ragionevole solo se si dispone di un numero limitato di valori possibili da confrontare OPPURE.

Maggiori informazioni su Array contengono qui , dal momento che è una novità per i documenti firebase


Non avrei un campo "status", ma campi relativi allo stato, aggiornandoli su true o false in base alla richiesta, come

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

Tuttavia, controlla le funzioni di Firebase Cloud. Si potrebbe avere una funzione in ascolto dei cambiamenti di stato, aggiornando proprietà relative allo stato come

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

l'uno o l'altro, la tua query potrebbe essere giusta

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

Spero che sia d'aiuto.


suggerire di dare valore anche allo status.
ex.

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

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

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

puoi eseguire una query per ref.where('statusValue', '<=', 20) quindi verranno trovati sia 'a' che 'b' .

questo può far risparmiare costi e prestazioni della query.

a proposito, non è tutto risolto.


OR non è supportato in quanto è difficile per il server ridimensionarlo (richiede lo stato di deduplicazione). Il problema consiste nell'emettere 2 query, una per ogni condizione e la deduplicazione sul client.





google-cloud-firestore