Firestore: esegue una query per elemento nella matrice del documento

Ho un documento “utente” che ha una chiave chiamata “foto”. Ecco una serie di stringhe che vengono salvate, ovvero gli ID dei documenti “foto”.

Voglio interrogare “utente” da questo campo “foto”: voglio tutti gli utenti che hanno questo ID nella proprietà “foto”.

Questo è ansible attraverso l’incendio?

Aggiunto operatore di query ‘array-contains’ da usare con .where () per trovare documenti in cui un campo array contiene un elemento specifico.

https://firebase.google.com/support/release-notes/js 5.3.0

Aggiornamento : disponibile anche in @google-cloud/firestore : https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

Aggiorna 2 https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

L’aggiornamento 3 è ora disponibile in Admin Node.js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases

Sfortunatamente non ancora, anche se è sulla nostra tabella di marcia.

Nel frattempo, dovrai utilizzare una mappa, sotto forma di:

 photos: { id1: true id2: true } 

Ora puoi trovare tutti gli utenti con id1 filtrando per photos.id1 == true .

Ulteriori informazioni sull’interrogazione di tali insiemi nella documentazione di Firebase .

Ecco un po ‘di espansione sulla risposta poiché alcuni sembrano essere confusi riguardo alla necessità di creare indici per ogni chiave, Firestore già indicizza i dati per query semplici, quindi puoi fare una semplice query come

 documentReference.where('param','==','value').onSnapshot(...) 

ma non è ansible eseguire una query composta a meno che non indicizzi i dati per tali parametri. Quindi avresti bisogno di indici per poter fare qualcosa del genere:

  documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...) 

Quindi, se hai bisogno delle foto per un ID, puoi salvarle come

 usersCollection : (a collection) uidA: (a document) photoField: (a field value that is a map or object) fieldID1 : true (a property of the photoField) fieldID2 : true (a property of the photoField) etc ... 

e puoi semplicemente interrogare gli utenti che hanno, diciamo, fieldID1 nel loro photoField senza bisogno di formare alcun indice o richiesta simile sotto.

 firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)