Angular 通过字段从Firestore中的集合获取某些文档

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

我正在用Angular 6和Angular 6开发一个web应用程序。我正在获取集合中的所有文档,但现在我需要查询这些文档,以获取具有
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)”以使其完整。