Получение всех документов из одной коллекции в Firestore

Привет, я начинаю с javascript и реагирую, и я пытаюсь выяснить эту проблему часами. Может ли кто-нибудь объяснить мне, как получить все документы из коллекции firestore?

Я пытался это сделать:

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;
}

Журнал 1 печатает все объекты (один за другим), но журнал 2 не определен, почему?

Ответ 1

Пример в другом ответе излишне сложный. Это было бы более просто, если все, что вы хотите сделать, - вернуть исходные объекты данных для каждого документа в запросе или коллекции:

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

Ответ 2

Я сделал это так:

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

Ответ 3

если вам нужно включить ключ документа в ответ, другой вариант:

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

Ответ 4

Вы можете получить всю коллекцию в виде объекта, а не массива, например:

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

Это даст вам лучшее представление о том, что в пожарном магазине. Нет ничего плохого в массиве, просто еще один вариант.

Ответ 5

Я предпочитаю скрывать всю сложность кода в моих службах... поэтому я обычно использую что-то вроде этого:

В моем events.service.ts

    async getEvents() {
        const snapchot = await this.db.collection('events').ref.get();
        return new Promise <Event[]> (resolve => {
            const v = snapchot.docs.map(x => {
                const obj = x.data();
                obj.id = x.id;
                return obj as Event;
            });
            resolve(v);
        });
    }

В моем sth.page.ts

   myList: Event[];

   construct(private service: EventsService){}

   async ngOnInit() {
      this.myList = await this.service.getEvents();
   }

Наслаждайтесь :)

Ответ 6

если вы хотите включить 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)
    })
}

То же самое с массивом

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)
   })
 }