43 votes

Firestore : Requête par élément dans le tableau du document

J'ai 2 collections "photos" y "utilisateurs" et chaque document dans "utilisateurs" a une ou plusieurs photos d'identité avec un tableau .

photos > 5528c46b > name: "Photo1"
         a1e820eb > name: "Photo2"
         32d410a7 > name: "Photo3"

users > acd02b1d > name: "John", photos: ["5528c46b"]
        67f60ad3 > name: "Tom", photos: ["5528c46b", "32d410a7"]
        7332ec75 > name: "Sara", photos: ["a1e820eb"]
        9f4edcc1 > name: "Anna", photos: ["32d410a7"]

Je veux obtenir tous les utilisateurs qui possèdent un ou plusieurs identifiants spécifiques avec photo .

Y a-t-il des moyens de le faire ?

34voto

Dan McGrath Points 9839

Voir Réponse d'Henry car nous n'avons pas rendu les requêtes Array Contains disponibles.

Malheureusement pas encore, bien que ce soit sur notre feuille de route.

En attendant, vous devrez utiliser une carte à la place, sous la forme de :

photos: {
    id1: true
    id2: true
}

Maintenant vous pouvez trouver tous les utilisateurs avec id1 en filtrant par photos.id1 == true .

Pour en savoir plus sur l'interrogation de ces ensembles, consultez la page Web suivante Documentation sur Firebase .

8 votes

Cette feuille de route est-elle publiée quelque part ? Simple curiosité.

0 votes

Ce n'est pas le cas. Nous ne parlons généralement pas des fonctionnalités futures, car des événements inattendus peuvent survenir et modifier les priorités (ou même la faisabilité).

2 votes

@DanMcGrath Y a-t-il une mise à jour de cette fonctionnalité / feuille de route ?

30voto

Henry Points 18460

Ajout de l'opérateur de requête "array-contains" à utiliser avec .where() pour trouver les documents dans lesquels un champ de type "array" contient un élément spécifique.

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

Mise à jour : également disponible en @google-cloud/firestore : https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

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

Mise à jour 3 désormais disponible dans Admin Node.js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases

2 votes

C'est génial. Merci de m'avoir prévenu.

1 votes

Eh bien, cela a pris un certain temps :D Je travaillais sur un projet où j'avais besoin de cela et je suis heureux d'avoir pris suffisamment de retard pour que l'équipe de firebase soit en tête :p

0 votes

C'est génial ! +1

5voto

TheeBen Points 1144

Voici quelques précisions sur la réponse, car certains semblent s'interroger sur la nécessité de créer des index pour chaque clé. Firestore indexe déjà vos données pour les requêtes simples, ce qui vous permet d'effectuer une requête simple telle que

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

mais vous ne pouvez pas faire une requête composée à moins d'indexer vos données pour ces paramètres. Vous avez donc besoin d'index pour pouvoir faire quelque chose comme ça :

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

Ainsi, tant que vous avez besoin des photos pour une identité, 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 le ou les utilisateurs qui ont, disons, fieldID1 dans leur photoField sans avoir besoin de former un index et comme la requête ci-dessous.

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

1voto

ThinkDigital Points 401

Firestore a désormais ajouté une requête " in " à partir de novembre 2019. Selon l'article d'annonce :

Avec la requête in, vous pouvez interroger un champ spécifique pour plusieurs valeurs (jusqu'à 10) dans une seule requête. (jusqu'à 10) dans une seule requête. Pour ce faire, vous transmettez une liste contenant toutes les valeurs que vous souhaitez rechercher, et Cloud Firestore correspondra à tout document dont le champ est égal à l'une de ces valeurs.

1voto

Kai Points 350

Avec la version 9 de Firebase (mise à jour de décembre 2021) :

Vous pouvez utiliser "tableau-contenu" con une seule pièce d'identité avec photo dans le "while()" pour obtenir tous les utilisateurs qui en disposent :

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains", "5528c46b")
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc"
});

Vous pouvez également utiliser " array-contains-any " con un ou plusieurs documents d'identification avec photo avec un tableau dans le "while()" pour obtenir plus d'utilisateurs correspondants :

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains-any", ["5528c46b", "a1e820eb"])
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc", "Sara's doc"
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X