145 votes

Récupérer tous les documents d'une collection dans Firestore

Bonjour, je débute avec javascript et react-native et j'essaie de résoudre ce problème depuis des heures maintenant. Quelqu'un peut-il m'expliquer comment récupérer tous les documents de la collection firestore ?

J'ai essayé ça :

async getMarkers() {
  const events = await firebase.firestore().collection('events').get()
    .then(querySnapshot => {
      querySnapshot.docs.map(doc => {
        console.log('LOG 1', doc.data());
        return doc.data();
      });
    });
  console.log('LOG 2', events);
  return events;
}

Log 1 imprime tous les objets (un par un) mais log 2 est indéfini, pourquoi ?

285voto

Doug Stevenson Points 6978

L'exemple donné dans l'autre réponse est inutilement complexe. Ce serait plus simple, si tout ce que vous voulez faire est de retourner les objets de données brutes pour chaque document dans une requête ou une collection :

async getMarker() {
    const snapshot = await firebase.firestore().collection('events').get()
    return snapshot.docs.map(doc => doc.data());
}

0 votes

Cela a fonctionné pour moi const snapshot = await firestore.collection('events').get()

4 votes

@etoxin Cela ne fonctionnerait que si vos importations/exigences étaient différentes de celles du PO.

0 votes

Cela compterait-il pour une lecture dans le quota, ou chaque document de la collection compterait-il comme une opération de lecture ?

36voto

Imanullah Points 357

Si vous voulez inclure Id

async getMarkers() {
  const events = await firebase.firestore().collection('events')
  events.get().then((querySnapshot) => {
      const tempDoc = querySnapshot.docs.map((doc) => {
        return { id: doc.id, ...doc.data() }
      })
      console.log(tempDoc)
    })
}

Même chose pour les tableaux

async getMarkers() {
  const events = await firebase.firestore().collection('events')
  events.get().then((querySnapshot) => {
      const tempDoc = []
      querySnapshot.forEach((doc) => {
         tempDoc.push({ id: doc.id, ...doc.data() })
      })
      console.log(tempDoc)
   })
 }

13voto

Vlt Points 107

Je l'ai fait fonctionner de cette façon :

async getMarkers() {
  const markers = [];
  await firebase.firestore().collection('events').get()
    .then(querySnapshot => {
      querySnapshot.docs.forEach(doc => {
      markers.push(doc.data());
    });
  });
  return markers;
}

10voto

Rodrigo Points 49

Si vous avez besoin d'inclure la clé du document dans la réponse, une autre alternative est :

async getMarker() {
    const snapshot = await firebase.firestore().collection('events').get()
    const documents = [];
    snapshot.forEach(doc => {
       documents[doc.id] = doc.data();
    });
    return documents;
}

6voto

colepanike Points 649

Vous pourriez obtenir la collection entière comme un objet, plutôt qu'un tableau comme ceci :

async getMarker() {
    const snapshot = await firebase.firestore().collection('events').get()
    const collection = {};
    snapshot.forEach(doc => {
        collection[doc.id] = doc.data();
    });
    return collection;
}

Cela vous donnerait une meilleure représentation de ce qu'il y a dans firestore. Rien de mal avec un tableau, juste une autre option.

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