Я хочу запросить у своего firestore массив документов, в которых содержится информация, ссылающаяся на другие документы.
получить документ «пользователь» => возвращает идентификаторы документов «элементы» => foreach (получить документ «элемент»)
getUserOwnedItems(uid:string):Observable<Item[]>{
return this.firestore
.collection<any>(`members`, ref => ref.where('uid', '==', uid))
.valueChanges()
.pipe(
switchMap(ids => { // these ids are representing the "item" ids
return ids.map(id => {
return this.firestore
.doc<Item>(`items/${id.itemId}`)
.valueChanges();
});
})
,concatAll() // <-- Iam not sure about this
);
}
Проблема в том, что я ожидаю наблюдаемого с массивом элементов. Вместо этого я получаю наблюдаемое из Item.
Как я могу преобразовать это в
Observable<Item[]>
? Заранее спасибо!
Моя структура в firestore выглядит следующим образом:
members : [
{
uid:string,
itemId:string,
...
}
]
items : [
{
id:string,
...
}
]
Вариант использования другими словами: Я хочу получить все элементы, связанные с конкретным пользователем, идентифицированным его uid.
Обновлять: Я обнаружил, что все слияния concats или forkJoins не работают в этом сценарии, потому что наблюдаемые данные firebase никогда не будут завершены.
Я мог бы сделать что-то вроде...
return this.firestore
.doc<Item>(`items/${id.itemId}`)
.valueChanges().pipe(first());
Но это нарушит мою связь в реальном времени. Кроме того, каждый вызов этой функции приведет к чтению в FireStore, что будет стоить денег.
идея состоит в том, чтобы объединить все запросы и отправить их обратно как один Observable.
SwitchMap возвращает один результат, поэтому у вас фактически есть один результат.





Вероятно, вы хотели использовать combineAll вместо concatAll, если вам нужно Observable<Item[]>.
Flattens an Observable-of-Observables by applying combineLatest when the Observable-of-Observables completes.
Converts a higher-order Observable into a first-order Observable by concatenating the inner Observables in order
Почему вы используете
concatAll?