Я делаю веб-приложение на 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};
}))
);
}
Проблема:
- Мне нужно подписаться и отписаться внутри компонента.
- Мне кажется, что я дублирую код, потому что у меня уже есть
документы (
this.users
), мне просто нужно запросить их по полю.
- Я делал
.take(1)
и .toPromise()
внутри моего getUsersWithModeratorRole
метод, но возвращает только один пользователь, и мне нужно все. Я думал, что с .take(1)
хватит все.
Моя цель - запросить уже имеющуюся у меня коллекцию (this.users
), чтобы найти всех пользователей, у которых есть поле role.moderator == true
, или преобразовать метод getUsersWithModeratorRole
в Обещание, чтобы правильно захватить все.