Как мне сделать запрос, основанный на возврате другого запроса в Angular с Firestore? - PullRequest
0 голосов
/ 30 октября 2018

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

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

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

categories/{categoryId}/users/{userId}

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

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

users/{userId}

А вот где я застрял и не уверен, что делать дальше .. Должен ли я хранить идентификаторы в массиве, а затем отправлять запросы в Firestore, используя цикл forEach в указанном массиве? Должен ли я дублировать данные пользователя в category / {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, но благодарю за любую помощь!

Спасибо.

UPDATE

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

.subscribe(ids => {
    ids.map(id => {
        this.afs.collection('users').doc<User>(id).valueChanges().map(user => {
            return user;
        }).subscribe(user => {
            console.log(user); //Got it!
        })
    })
})

1 Ответ

0 голосов
/ 31 октября 2018

Я хочу использовать восстановленные идентификаторы пользователей по указанному выше пути и использовать их для получения пользовательских данных по следующему пути: 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 нет ничего плохого.

Должен ли я хранить идентификаторы в массиве, а затем отправлять запросы в Firestore, используя цикл forEach в указанном массиве?

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

Должен ли я дублировать данные пользователя по категориям / {categoryId} / users / {userId}? Возможно, измените мою структуру данных Firestore?

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

Или, может быть, есть другой способ сделать это в Angular?

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

...