Получить определенные документы из коллекции в Firestore по полю - PullRequest
0 голосов
/ 16 марта 2019

Я делаю веб-приложение на Angular 6 и angularfire2 . Я получаю все документы в коллекции, но теперь мне нужно запросить эти документы, чтобы получить все документы с полем role.moderator == true.

  private usersCollection: AngularFirestoreCollection<User>;
  users: Observable<UserId[]>;
  moderators: Observable<UserId[]>;

  constructor(
    private afs: AngularFirestore
  ) {
    this.usersCollection = afs.collection<User>(config.collection_users);

    this.users = this.usersCollection.snapshotChanges().pipe(
      map(actions => actions.map(a => {
        const data = a.payload.doc.data() as User;
        const id = a.payload.doc.id;
        return {id, ...data};
      }))
    );

    // Query this.users ?
  }

Интерфейс пользователя:

export interface User {
  firstName: string;
  lastName: string;
  emailAddress: string;
  roles: Roles;
  officeAssignedId: string;
}

export interface UserId extends User {
  id: string;
}

export interface Roles {
  administrator?: boolean;
  moderator?: boolean;
}

Чтобы получить всех пользователей с ролью модератора, я делал:

getUsersWithModeratorRole() {
    return this.afs.collection<User>(
      config.collection_users,
      ref => ref.where('roles.moderator', '==', true)).snapshotChanges().pipe(
      map(actions => actions.map(a => {
        const data = a.payload.doc.data() as User;
        const id = a.payload.doc.id;
        return {id, ...data};
      }))
    );
  }

Проблема:

  1. Мне нужно подписаться и отписаться внутри компонента.
  2. Мне кажется, что я дублирую код, потому что у меня уже есть документы (this.users), мне просто нужно запросить их по полю.
  3. Я делал .take(1) и .toPromise() внутри моего getUsersWithModeratorRole метод, но возвращает только один пользователь, и мне нужно все. Я думал, что с .take(1) хватит все.

Моя цель - запросить уже имеющуюся у меня коллекцию (this.users), чтобы найти всех пользователей, у которых есть поле role.moderator == true, или преобразовать метод getUsersWithModeratorRole в Обещание, чтобы правильно захватить все.

1 Ответ

0 голосов
/ 16 марта 2019

Вы можете создать метод, который возвращает Observable в вашем сервисе, например:

getUsersWithModeratorRole(): Observable<UserId[]> {
  return this.users.pipe(
    map(users => users.filter(user => user.roles.moderator === true))
  );
}

Или, если вы хотите, чтобы оно вернуло обещание, я думаю, это будет примерно так:

getUsersWithModeratorRole(): Promise<UserId[]> {
  return this.users.pipe(
    take(1),
    map(users => users.filter(user => user.roles.moderator === true))
  ).toPromise();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...