Firestore / Rxfire - коллекция запросов, а затем подписаться на массив под-наблюдаемых - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть коллекция chat в firestore, которая содержит сообщения. К каждому сообщению прикреплено userUid. sh я хотел бы выполнить следующим образом:

  1. Запрос коллекции chat для массива каждого сообщения

  2. Выполните итерацию по каждому сообщению и запросите соответствующего пользователя, выполните c, чтобы добавить информацию о пользователе в сообщение

  3. Имейте один единственный subscribe, который теперь предоставляет исходный массив сообщений с добавленная информация

  4. (если возможно - combLatest? ) каждый раз при добавлении сообщения было бы идеально запрашивать только пользовательскую коллекцию для нового сообщения

Следующий фрагмент - это то, с чем я сейчас работаю:

const chatRef = db.collection('chat')
const messageUser$ = collectionData(chatRef, 'id')
    .pipe(
        switchMap(messages => {
            return forkJoin(...messages.map(m => {
                const userRef = db.collection('users').doc(m.userUid)
                return docData(userRef)
                    .pipe(
                        map(user => ({ ...user, ...m }))
                    )
            }))
        })
    )
messageUser$.subscribe(data => console.log('data', data))

Я работал с другом, чтобы придумать два рабочих решения ниже, но ни один не работал когда настроено для моего приложения

https://stackblitz.com/edit/rxjs-nzn11o

1 Ответ

1 голос
/ 29 апреля 2020

Понял!

collectionData(db.collection('chat'))
    .pipe(
        switchMap(messages =>
            combineLatest(
                messages.map(m =>
                    docData(db.collection('users').doc(m.userUid)).pipe(
                        map(user => ({ ...user, ...m }))
                    )
                )
            )
        )
    )
    .subscribe(enhancedMessages => console.log(enhancedMessages))
...