Запрос 3 коллекций из firestore

Я использую объект под названием «Documento» для хранения данных в firestore, а затем, когда я получаю эти данные, я сохраняю их в структуре JSON. Моя проблема в том, что теперь мне нужно выполнить три запроса. Один - расписание, другой - врач, а третий - его типа. Все три из них хранятся в разных запросах, теперь в моем расписании должно быть имя врача из коллекции врачей и его тип, который находится в моей третьей коллекции.

Поэтому я хотел бы знать, как запросить их вместе и объединить в один объект, чтобы я мог отображать информацию о моем пациенте вместе с информацией о его докторе, что привело бы к моему расписанию, которое будет переведено в HTML.

Вот скриншот того, как структурирована моя база / хранилище огня:

Мое расписание, в котором должен быть какой-то внешний ключ Запрос 3 коллекций из firestore

Запрос 3 коллекций из firestore

Запрос 3 коллекций из firestore

Запрос 3 коллекций из firestore

Тогда вот как я получаю свои данные из firestore в виде объекта в структуре JSON:

  carregarPerfil(){
    var query = firebase.firestore().collection("Usuario")
    var auxint = 0;
    this.dataAux
    let auxString = '[';
    query.where('Documento.nome', '==', 'Merlin').where('Documento.login', '==', 'merlin').get().then(res => {
      res.forEach(item => {

        auxint++;
        auxString += '{"id":"' + item.id + '","Usuario":' + JSON.stringify(item.data()) + '}';
        console.info(item);
        if (res.size != auxint)
          auxString += ', ';
      })
      auxString += ']';
      this.dataJSON = JSON.parse(auxString);
      this.Usuario = this.dataJSON;
      console.info(this.Usuario);
    }).catch(err => {
      console.info('algum erro ' + err);
    });
}

Я пробовал читать документацию по firestore, но из-за того, что он не рассматривает его как JSON и не показывает, как это сделать, используя 3 пошаговых запроса, мне было сложно, поэтому мне нужно некоторая помощь в этом.

Вы можете цепь три запроса с then(), один за другим. Фактически, поскольку метод get() является асинхронным и возвращает обещание, вы должны дождаться разрешения обещания, прежде чем сможете использовать значения, возвращаемые запросом. Вы должны предоставить гораздо больше деталей о своей структуре данных (т. Е. О трех коллекциях), чтобы сообщество могло вам помочь. Другой подход - денормализовать ваши данные и, например, добавить тип врача в документ врача, уменьшив количество запросов до 2.

Renaud Tarnec 19.09.2018 08:01

Я обновил основной пост, добавив более подробную картину моей текущей структуры. В любом случае, не могли бы вы привести пример того, как я могу связать эти запросы после обработки обещаний?

xnok 19.09.2018 15:07

Правильно ли я понимаю, что в документе с повесткой дня у вас есть идентификаторы трех других документов (Especialidade, Medico и Patiente), и вы хотите получить информацию из этих трех документов в конце (за один раз)?

Renaud Tarnec 19.09.2018 15:18

Да, это именно то, что мне нужно сделать, и я не могу понять, мне нужен атрибут nome от Medico, мне нужен атрибут nome от Paciente, и мне нужен nome от Especialidade, и перечислите их с данными повестки дня, что-то вроде внешнего ключа в основном, денормализация займет некоторое время, так как я не уверен, что парень, занимающийся обработкой, справится с этой работой

xnok 19.09.2018 15:21

Смотрите мой ответ. Обратите внимание, что в ответе мы нет объединяем несколько обещаний в цепочку, поскольку мы выполняем их параллельно, а не последовательно. Напротив, мы используем Promise.all().

Renaud Tarnec 19.09.2018 15:45

Да, просто пытаюсь выяснить, что вызвало Uncaught (в обещании): TypeError: невозможно прочитать коллекцию свойств undefined

xnok 19.09.2018 16:01

заменить db на firebase.firestore(). Адаптирую ответ

Renaud Tarnec 19.09.2018 16:02

Удивительный! это прекрасно работает, это действительно спасло жизнь! Только один вопрос, как я могу распечатать данные с помощью интерполяции строк?

xnok 19.09.2018 16:10

Позвольте нам продолжить обсуждение в чате.

Renaud Tarnec 19.09.2018 16:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
9
1 053
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующее поможет. Поскольку вы хотите получить три документа в параллели и поскольку метод get() является асинхронным и возвращает обещание, вам необходимо использовать Promise.all(). Обратите внимание, что массив results имеет тот же порядок, что и массив promises (поэтому первым элементом results является документ especialidade, затем - medico и т. д.).

Обратите внимание, что я адаптировал названия коллекций на английский язык. Просто измените, чтобы использовать свои собственные имена коллекций. Идентификаторы документов также должны быть адаптированы к вашим.

    var db = firebase.firestore();
    var promises = []

    var especialidadeQuery = db.collection('specialties').doc('xTWQVLM8O9WRx89LS1Ba').get();
    promises.push(especialidadeQuery);

    var medicoQuery = db.collection('doctors').doc('CP5Gd2UwGyDYqs9eXuGl').get();
    promises.push(medicoQuery);

    var patienteQuery = db.collection('patients').doc('AMZpmX9BOyRlfPQpwfmz').get();
    promises.push(patienteQuery);

    Promise.all(promises).then(results => {
        results.map(docSnapshot => {
            console.info(docSnapshot.data());
        });
    });

Однако обратите внимание, что если вам просто нужны имена пациента, врача и специализации, вы можете сохранить эти значения непосредственно в документе повестки дня. Этот механизм денормализации довольно распространен в слове базы данных NoSQL и позволяет оптимизировать запросы (здесь 1 вместо 1 + 3).

Другие вопросы по теме