Angular 通过字段从Firestore中的集合获取某些文档
我正在用Angular 6和Angular 6开发一个web应用程序。我正在获取集合中的所有文档,但现在我需要查询这些文档,以获取具有Angular 通过字段从Firestore中的集合获取某些文档,angular,firebase,google-cloud-firestore,Angular,Firebase,Google Cloud Firestore,我正在用Angular 6和Angular 6开发一个web应用程序。我正在获取集合中的所有文档,但现在我需要查询这些文档,以获取具有role.moderator==true字段的所有文档 private usersCollection: AngularFirestoreCollection<User>; users: Observable<UserId[]>; moderators: Observable<UserId[]>; constr
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 ?
}
为了让所有用户都成为版主,我做了以下工作:
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};
}))
);
}
getUsersWithModeratorRole(){
返回此.afs.collection(
config.collection\u用户,
ref=>ref.where('roles.moderator','=',true)).snapshotChanges().pipe(
map(actions=>actions.map(a=>{
const data=a.payload.doc.data()作为用户;
const id=a.payload.doc.id;
返回{id,…data};
}))
);
}
问题是:
this.users
),我只需要按字段查询它们getUsersWithModeratorRole
方法,但只返回一个用户,我需要所有用户。我以为用.take(1)
就能抓住一切我的目标是查询我已经拥有的集合(
this.users
),以找到所有具有字段role.moderator==true
的用户,或者将getUserSwithModelOrole
方法转换为正确获取全部的承诺。您可以创建一个方法,在您的服务上返回一个可观察值,如下所示:
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();
}
getUsersWithModeratorRole():可观察{
返回此.users.pipe(
映射(用户=>users.filter(用户=>user.roles.版主===true))
);
}
或者,如果你想让它回报一个承诺,我想应该是这样的:
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();
}
getUsersWithModeratorRole():承诺{
返回此.users.pipe(
以(1)为例,
映射(用户=>users.filter(用户=>user.roles.版主===true))
).toPromise();
}
我很难理解你在问什么/你想实现什么,你能重新表述一下吗?如果要获取role.moderator==true的所有用户,并且已经检索到所有用户,则可以在此用户数组上执行筛选。如果您尚未检索到所有用户,并且希望直接从Firestore查询role.moderator==true的所有用户,那么您的GetUserSwithModelatorRole()方法看起来是正确的。@SnorreDan您好,谢谢您回复我。我不想在组件中订阅和取消订阅。我想将其转换为承诺,或者,由于我已经拥有服务中this.users
的所有文档,我如何在将结果发送到我的组件之前查询this.users
。我的意思是,查询this.users
仅获取具有role.moderator==true
字段的用户。使用我的getUsersWithModeratorRole
方法,我觉得我在不必要地复制代码。在第二个代码段中,我认为您有一个错误,应该是这样的:返回this.users.pipe(map(users=>users.filter(user=>user.roles.moderator==true)).toPromise()代码>。但是,它对我不起作用,该方法一直在运行,而且永远不会结束。第一个片段,可观察的
,正在工作,但是,我更喜欢承诺
,我希望您能帮助我在承诺
的片段中找到问题,关于它为什么没有完成和没有返回数据。关于错误,您是正确的,我已经更新了我的答案。我不太熟悉toPromise()的工作原理,但您能否尝试在服务的管道中添加一个“publishReplay(1)”呢?因此,您需要在第15行的末尾添加一个逗号,然后添加一个新的第16行,带有“publishReplay(1)”。嗨,这对我也不起作用。这个方法永远不会结束。我很确定我现在知道这个问题了。要使toPromise()起作用,需要完成可观察对象。我在上面的代码示例中添加了一个“take(1)”以使其完整。