Firebase - как получить дополнительные данные для каждого документа в коллекции - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь получить пользователя для каждого из моих сообщений документов.У нас есть:

users
    user_id => user_data
message
    msg_id => { message, user_id }

Итак, я попытался (основываясь на ответе ):

getUserData(userId) {
  const docRef = this.afs.collection('/users').doc(userId);
  return docRef.ref.get();
}

getMsgs(topicId){
  return this.afs.collection('/topics_msgs/' + topicId + "/comments").snapshotChanges().map(actions => {
    return actions.map(a => {
      const commentData = a.payload.doc.data();
      this.getUserData(commentData.user_id).then(
        user => {
          return {user: user.data(), ...commentData};
        }
      );
    });
  });

}

и в компоненте:

this.firebaseService.getMsgs(this.id).subscribe( msgs => {
  console.log(msgs);
  this.messages = msgs;
})

но, конечно, это не может работать - внутренняя карта не возвращает ничего, кроме обещания, поэтому компонент получает список undefined.

Я немногоЗастрял здесь о том, как бороться с этим.Спасибо вперед.

1 Ответ

0 голосов
/ 24 октября 2018

Используйте наблюдаемые более высокого порядка, чтобы преобразовать ваши данные в тип, который соответствует вашим потребностям.Что касается вашей проблемы (и из того, что я понимаю), вы можете сделать что-то вроде этого:

    getUserData(userId): Observable<UserData> {
      const docRef = this.afs.collection('/users').doc(userId);
      return docRef.snapshotChanges().pipe(
          map(action => ({ ref: action.payload.ref, ...action.payload.data()}))
      );
    }

    getMsgs(topicId): Observable<CommentData[]>{
      return this.afs.collection('/topics_msgs/' + topicId + "/comments").snapshotChanges().pipe(
        mergeMap(actions => {
          const commentsDataObservableArray: Observable<CommentData>[] = actions.map(a => {
            const commentData = a.payload.doc.data();
            return this.getUserData(commentData.user_id).pipe(
              map(user => {
                return {user: user.data(), ...commentData};
              })
            );
          });
          return combineLatest(commentsDataObservableArray);
        })
      );
    }
...