J'ai un document "utilisateur" qui a une clé appelée "photos". Voici un tableau de chaînes en cours de sauvegarde, à savoir les identifiants des documents "photo".
Je souhaite interroger "utilisateur" par le champ "photos": je souhaite que tous les utilisateurs possédant cet identifiant figurent dans la propriété "photos".
Est-ce possible par Firestore?
Ajout d'un opérateur de requête 'array-includes' à utiliser avec .where () pour rechercher des documents dans lesquels un champ de tableau contient un élément spécifique.
https://firebase.google.com/support/release-notes/js 5.3.0
Update : également disponible dans @google-cloud/firestore
: https://github.com/googleapis/nodejs-firestore/releases/tag /v0.16.
Mise à jour 2 https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html
La mise à jour 3 est désormais disponible dans Admin Node.js SDK version 6.0.0 https://github.com/firebase/firebase-admin-node/releases
Voir réponse de Henry , car nous n'avons pas encore fait de requêtes Array Contains disponibles.
Malheureusement pas encore, bien que cela soit sur notre feuille de route.
En attendant, vous devrez utiliser une carte à la place, sous la forme de:
photos: {
id1: true
id2: true
}
Vous pouvez maintenant trouver tous les utilisateurs avec id1 en filtrant par photos.id1 == true
.
Pour plus d'informations sur l'interrogation de tels ensembles, consultez la section documentation Firebase .
Voici un peu d’expansion sur la réponse car certains semblent confus quant au fait de devoir créer des index pour chaque clé. Firestore indexe déjà vos données pour des requêtes simples. Vous pouvez donc faire une requête simple comme
documentReference.where('param','==','value').onSnapshot(...)
mais vous ne pouvez pas faire de requête composée à moins d'indexer vos données pour ces paramètres. Il faudrait donc des index pour pouvoir faire quelque chose comme ceci:
documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...)
Donc, tant que vous avez besoin des photos pour un identifiant, vous pouvez les enregistrer en tant que
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 ...
et vous pouvez simplement interroger les utilisateurs qui ont, disons, fieldID1 dans leur champ de données sans avoir besoin de former d'index et de requête similaire ci-dessous.
firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)