Я пытаюсь получить некоторые идентификаторы из коллекции, а затем пытаюсь использовать каждый из этих идентификаторов, чтобы получить больше данных из другой коллекции. Вот что я сделал на данный момент:
По сути, у меня есть приложение для блога, в котором несколько пользователей смогут опубликовать статью. И в указанной статье есть категории. Дело в том, что когда пользователь выбирает категорию для фильтрации, я получаю всех ПОЛЬЗОВАТЕЛЕЙ, у которых есть статья в указанной категории (вместо того, чтобы приносить все статьи выбранной категории).
Итак, в 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!
})
})
})
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?
Другого подхода в данном случае я не вижу. Вам решать, какое решение может быть лучше для вас, учитывая информацию в ответе из сообщения выше.
Привет, Алекс! Извините, что так долго, но ваше решение сработало!
Спасибо за очень подробный ответ! Я обновил свой пост. Я проверю сообщение, которое вы связали, это еще одна вещь, с которой у меня проблемы, структура базы данных! Спасибо еще раз
Привет, Матеус! Вы пробовали мое решение выше, оно работает?