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

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

  1. Пользователь => с некоторым полем
  2. Организация => с некоторым полем
  3. UserOrg с полями, такими как:
    • uid // идентификатор пользователя
    • orgid // orgid
    • userDetails // ссылка на документ документа пользователя, например user / uid
    • orgDetails // ссылка документа документа org likeorg / uid

Теперь мне нужно получить пользовательские данные о пользователях

Мой код:

return this.dbCollectionService.userOrganizationCollection.snapshotChanges()
      .pipe(map(res => {
        return res.map(data => {
          var userData = data.payload.doc.data()
         let userDetails : any;
         if (userData.userDetails) {

this.angularFirestore.doc(userData.userDetails).valueChanges().subscribe(res => {
          userDetails = res;
          console.log(userDetails);
        });

      return { id, ...userDetails }

    }).filter( f => f.organizationId != undefined && f.organizationId == orgId)
  }));

Это возможнодля корректного отображения результата, но не для возврата данных.

Может быть получение данных из ссылки на данные, требующее времени, и оператор return выполняется раньше.

1 Ответ

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

return { id, ...userDetails } выполняется перед подпиской на this.angularFirestore .doc(userData.userDetails).valueChanges().

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

return this.dbCollectionService
.userOrganizationCollection.snapshotChanges()
.pipe(
   map(res => res.map(data => data.payload.doc.data())),
   map(userDatas => userDatas.filter(_ => _)),
   map(userDatas => userDatas.map(this.angularFirestore.doc(userData.userDetails).valueChanges()
                                    .pipe(map(userDetails => ({ id, ...userDetails }))))),
   switchMap(userDatas$ => combineLatest(userDatas$)),
   map(users => users.filter( f => f.organizationId != undefined && f.organizationId == orgId))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...