RxJs потоки с несколькими ветками Firestore - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть нормализованная структура 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 для достиженияэто. Мне нужно

  1. вернуть список друзей текущего пользователя (коллекция друзей)
  2. Получить все идентификаторы встречи, связанные с этим пользователем (коллекция usersVsMeetings)
  3. Получитьвсе детали каждого собрания (собрание собраний)
  4. Получите информацию о пользователях и прикрепите к каждому собранию (собрание пользователей)

Это код, который у меня есть,возвращая массив с правильным профилем пользователя как [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, но я не могу понять, какие наблюдаемые мне нужно переключить и отменить (например, когда вы получаете идентификаторы собраний), а какие сохранить, когда мне нужны данные (то есть полные сведения о собрании)

Кто-нибудь хочет помочь

спасибо

...