Как мне сделать запрос на основе возврата другого запроса в Angular с Firestore?

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

По сути, у меня есть приложение для блога, в котором несколько пользователей смогут опубликовать статью. И в указанной статье есть категории. Дело в том, что когда пользователь выбирает категорию для фильтрации, я получаю всех ПОЛЬЗОВАТЕЛЕЙ, у которых есть статья в указанной категории (вместо того, чтобы приносить все статьи выбранной категории).

Итак, в Firestore у меня есть:

categories/{categoryId}/users/{userId}

Хотя {userId} содержит дополнительную информацию (например, идентификаторы статей в этом {categoryId}), меня пока интересует только сам userId.

Я хочу использовать восстановленные идентификаторы пользователей из указанного выше пути и использовать их для получения пользовательских данных по следующему пути:

users/{userId}

И вот здесь я застрял и не знаю, что делать дальше. Следует ли мне хранить идентификаторы в массиве, а затем делать запросы в Firestore, используя цикл forEach в указанном массиве? Стоит ли дублировать пользовательские данные на категории / {categoryId} / users / {userId}? Возможно, измените мою структуру данных Firestore? Или, может быть, есть другой способ сделать это в Angular?

this.afs.collection<Category>('categories').doc(category.name).collection<User>('users')
            .snapshotChanges().map(docChangeActionArray => {
                return docChangeActionArray.map(value2 => {
                    return value2.payload.doc.id;
                })
            }).subscribe(ids => {

                //WHAT TO DO HERE?
            })

Прошу прощения за такой простой вопрос. Я все еще разбираюсь в Angular и Firestore, но ценю любую помощь!

Спасибо.

ОБНОВИТЬ

Я сделал следующее:

.subscribe(ids => {
    ids.map(id => {
        this.afs.collection('users').doc<User>(id).valueChanges().map(user => {
            return user;
        }).subscribe(user => {
            console.info(user); //Got it!
        })
    })
})
Тестирование функциональных 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
0
0
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

What I want to do is to use the recovered userIds from the above path, and use it to get the user data from the following path: users/{userId}

Ты почти там. Что вам нужно сделать, так это использовать id пользователя, который вы получаете из базы данных, внутри новой ссылки. Поэтому в этом случае вам нужно использовать вложенные слушатели. Итак, внутри вашего первого обратного вызова просто создайте новую ссылку, используя идентификатор пользователя, и получите детали для каждого пользователя следующим образом:

return docChangeActionArray.map(value2 => {
    return value2.payload.doc.id;

    this.afs.collection<User>('users').doc(value2.payload.doc.id).snapshotChanges().map(/* ... */);
})

Обратите внимание: во вложенных слушателях в Cloud Firestore нет ничего плохого.

Should I store the ids in a array, and then make requests to Firestore using a forEach loop in said array?

В этом нет необходимости.

Should I duplicate the user data on categories/{categoryId}/users/{userId}? Perhaps change my Firestore data structure?

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

Or perhaps theres a different way to do it in Angular?

Другого подхода в данном случае я не вижу. Вам решать, какое решение может быть лучше для вас, учитывая информацию в ответе из сообщения выше.

Привет, Матеус! Вы пробовали мое решение выше, оно работает?

Alex Mamo 01.11.2018 06:42

Привет, Алекс! Извините, что так долго, но ваше решение сработало!

Matheus 01.11.2018 17:25

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

Matheus 01.11.2018 17:37

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