Я хочу попросить у моего пожарного магазина массив документов, в которых содержится информация, относящаяся к другим документам.
get "user" document => возвращает идентификаторы "items" documents => foreach (get "item"document)
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
);
}
Проблема в том, что я ожидаю наблюдаемого с массивом предметов.Вместо этого я получаю наблюдаемый предмет обратно.
Как я могу преобразовать это в
Observable<Item[]>
?Заранее спасибо!
Моя структура в firestore выглядит следующим образом:
members : [
{
uid:string,
itemId:string,
...
}
]
items : [
{
id:string,
...
}
]
Вариант использования, другими словами: я хочу, чтобы все элементы, связанные с конкретным пользователем, идентифицировались по его uid.
Обновление: я обнаружил, что все конкатсы mergs или forkJoins не работают в этом сценарии, потому что наблюдаемые в firebase никогда не будут завершены.
Я мог бы сделать что-то вроде ...
return this.firestore
.doc<Item>(`items/${id.itemId}`)
.valueChanges().pipe(first());
Но это сломает мою связь в реальном времени.Кроме того, каждый вызов этой функции приведет к чтению в FireStore, что будет стоить денег.