У меня есть нормализованная структура Firestore с несколькими коллекциями, но я пытаюсь написать функцию, которая возвращает мне набор данных с несколькими поисками и вызовами данных. У меня есть следующая структура FS
--friends // collection - (array of strings)
--uasfm923je2j3j3j (user Id - document)
--friends (array of strings)
-- ijdu0923jfe0w9wee (userId of friends)
-- 9rie3i3i3oo3i3i3
--users // collection
--9034rjf90jwo230 (userId - document)
-- name, dob, address (fields)
--meetingsVsUsers // collection
--9034rjf90jwo230 (userId - document)
--allMeetings (array of strings)
-- 939i3828u2ik2k2k (meeting Id)
--meetingDetails
--939i3828u2ik2k2k (meeting Id - document)
-- date, time, place etc (fields)
. Мне нужно, чтобы можно было наблюдать за всеми встречами моих друзей с прикрепленной информацией о них, например,
Встречи: {дата: "1 января",время: "12:00", место: "Дом", ownerInfo: {name: "Joe", dob "01.01.1970"})
Я не могу найти правильную комбинацию операций RxJ для достиженияэто. Мне нужно
- вернуть список друзей текущего пользователя (коллекция друзей)
- Получить все идентификаторы встречи, связанные с этим пользователем (коллекция usersVsMeetings)
- Получитьвсе детали каждого собрания (собрание собраний)
- Получите информацию о пользователях и прикрепите к каждому собранию (собрание пользователей)
Это код, который у меня есть,возвращая массив с правильным профилем пользователя как [0] и подробностями о собрании в [1], но он работает только в том случае, если у пользователя есть одно собрание
return this.firestoreSvc.documentAsObservable(`friends/${this.loggedOnUserProfile.uid}`).pipe(
switchMap(friends => from(friends['friends'])),
mergeMap(friendId => {
const meetingsWithProfile = combineLatest(
this.firestoreSvc.documentAsObservable(`users/${friendId}`),
this.firestoreSvc.documentAsObservable(`usersVsMeetings/${friendId}`)
.pipe(switchMap(allMeetings => this.firestoreSvc.documentAsObservable(`meetings/${allMeetings['allMeetings']}`)))
)
.pipe(map(data => ({ friendProfile: data[0], meeting: data[1] })))
meetingsWithProfiles$.push(meetingWithProfile);
return meetingsWithProfiles$.length ? combineLatest(meetingsWithProfiles$) : of([]);
})
);
Я также пробовал forkJoin и concat, так каквыступает против switchMap, но я не могу понять, какие наблюдаемые мне нужно переключить и отменить (например, когда вы получаете идентификаторы собраний), а какие сохранить, когда мне нужны данные (то есть полные сведения о собрании)
Кто-нибудь хочет помочь
спасибо