Соединение с объектом из результата массива коллекции - PullRequest
0 голосов
/ 14 октября 2018

У меня есть 2 коллекции:

Пользователи: uid, displayName.

Действия: документы, которые пользователь может создавать.Он также содержит userUid со своими ссылками на коллекцию Users

Я получаю такие действия:

this.activities = this.afs.collection<Activity>('activities')
 .snapshotChanges()
 .pipe(
   map((actions) => {
    return actions.map((a) => {
      const data = a.payload.doc.data();
      data.uid = a.payload.doc.id;
      return data;
    })
  }));

Итак, мой вопрос: как лучше всего присоединиться и получить также пользователя?данные?

Я пытался так:

actReference.snapshotChanges().pipe(
  map((actions) => {
    return actions.map((a) => {
      const actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;

      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData };
          }))
    })
  }));

Но он возвращает мне

 Observable<Observable<Activity>[]>>

Ответы [ 2 ]

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

@ suresh-kumar-ariya ответ не был моим конечным результатом, но мне очень помог, в итоге я получил такой код:

 return actReference.snapshotChanges().pipe(
  map((actions) => {
    return actions.map((a) => {
      const actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;

      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData } as Activity;
          }))
    })
  }),
  mergeMap(obs => combineLatest(obs))
);
0 голосов
/ 14 октября 2018

Вам необходимо применить цепочку оператора rxjs.

actReference.snapshotChanges().pipe(
  map((actions) => {
    actions.map((a) => ({
      let actData = a.payload.doc.data();
      actData.uid = a.payload.doc.id;
      actData.displayName = a.payload.doc.name;
      return actData;
    });
  }),
  map((userData) => {
      return this.userService.getUserDocById(actData.userUid).snapshotChanges()
        .pipe(
          map((userActions) => {
            const userData = userActions.payload.data();
            return { user: { uid: userData.uid, displayName: userData.displayName }, ...actData };
          }))
    })
  }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...