6 votes

collectionGroup à l'intérieur d'un certain chemin

J'aimerais faire une requête de groupe de collection mais à l'intérieur d'un certain chemin, c'est-à-dire que j'aimerais cibler les collections non seulement avec le collectionId mais aussi avec l'endroit où se trouve la collection.

Reprenons l'exemple utilisé dans la documentation pour mieux l'expliquer. Nous aurions des points de repère dans les villes et des points de repère "généraux" dans leur propre collection :

let citiesRef = db.collection('cities');

let landmarks = Promise.all([
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Golden Gate Bridge',
    type: 'bridge'
  }),
  citiesRef.doc('SF').collection('landmarks').doc().set({
    name: 'Legion of Honor',
    type: 'museum'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'Griffith Park',
    type: 'park'
  }),
  citiesRef.doc('LA').collection('landmarks').doc().set({
    name: 'The Getty',
    type: 'museum'
  }),
  citiesRef.doc('DC').collection('landmarks').doc().set({
    name: 'Lincoln Memorial',
    type: 'memorial'
  })
]);

let generalLandmarks = Promise.all([
  db.collection('landmarks').doc().set({
    name: 'National Air and Space Museum',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Ueno Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({
    name: 'National Museum of Nature and Science',
    type: 'museum'
  }),
  db.collection('landmarks').doc().set({
    name: 'Jingshan Park',
    type: 'park'
  }),
  db.collection('landmarks').doc().set({ 
    name: 'Beijing Ancient Observatory',
    type: 'museum'
  })
]);

J'aimerais maintenant rechercher des points de repère situés dans une ville et ne pas obtenir les points de repère généraux. Plus simplement, j'aimerais faire quelque chose comme ceci :

let museums = db.collection('cities').collectionGroup('landmarks').where('type', '==', 'museum');

Est-ce possible ?

5voto

Doug Stevenson Points 6978

Ceci n'est actuellement pas possible avec Cloud Firestore. Lorsque vous effectuez une requête sur un groupe de collections, elle utilise toutes les collections et sous-collections portant le nom donné. Il n'est pas possible de limiter la portée de la requête à des collections spécifiques.

Ce que vous pouvez faire à la place, c'est stocker un champ dans les documents de chaque sous-collection qui identifie la collection de premier niveau à laquelle ils appartiennent, puis utiliser ce champ pour filtrer vos résultats.

1voto

Alex Mamo Points 44420

J'aimerais maintenant rechercher des points de repère situés dans une ville et ne pas obtenir les points de repère généraux.

Non, vous ne pouvez pas. La requête de groupe de collections renvoie les résultats de toutes les collections ou sous-collections portant le même nom, y compris les collections générales. Il n'y a aucun moyen de modifier cela.

La solution consiste à modifier le nom de vos collections pour qu'il soit différent si vous souhaitez limiter la portée de votre requête de groupe de collections.

Si votre application est en cours de production et que vous ne pouvez pas changer le nom de vos collections, essayez simplement d'ignorer les résultats que vous obtenez côté client. Pour ce faire, il vous suffit de jeter un coup d'œil au chemin d'accès du document et de voir à quelles collections il appartient. De cette manière, vous ne pouvez utiliser que le résultat de la collection dont vous avez besoin.

Une autre solution consisterait à ajouter une nouvelle propriété de type booléen dans vos collections, nommée isGeneral et le fixer à true dans la collection générale et false dans les autres. Pour n'obtenir que les éléments particuliers et non la collection générale, ajoutez à votre requête un appel "where" :

whereEqualTo("isGeneral", false);

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