web-dev-qa-db-fra.com

Firestore: Requête par item dans un tableau de document

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?

37
Jaap Weijland

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

27
Henry

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 .

32
Dan McGrath

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(...)
5
TheeBen