【问题标题】:How to dynamically add parameters to firestore query and map to object如何将参数动态添加到 Firestore 查询并映射到对象
【发布时间】:2019-11-06 01:41:24
【问题描述】:

将数据映射到对象并将其作为 promise/observable 返回同时能够向查询添加动态/条件参数的推荐方法是什么。

在 getCompanies2 中,我可以向查询动态添加参数,但我不知道如何将返回的数据映射到我的对象并将其作为 promise/observable 返回。

在 getCompanies 中,一切都按我的意愿工作,但如果我有要添加的动态查询参数,我必须复制代码(如下所示)。

注意:convertDocTimeStampsToDate 只是按照它说的去做。我已经排除了它以减少代码部分的大小。

getCompanies(searchText: string, useWhereActive: boolean): Observable<Company[]> {
    if (useWhereActive) {
      return this.db.collection('companies', ref => ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
      .where('active', '==', true)
    )
      .snapshotChanges()
      .pipe(
        map(snaps => convertSnaps<Company>(snaps)),
        first()
      );
    } else {
      return this.db.collection('companies', ref => ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
    )
      .snapshotChanges()
      .pipe(
        map(snaps => convertSnaps<Company>(snaps)),
        first()
      );
    }
  }
​
getCompanies2(searchText: string, useWhereActive: boolean) {
    let query = this.db.collection('companies').ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');
​
    if (useWhereActive) {
      query.where('active', '==', true);
    }
​
    query.get().then(querySnapshot => {
      const results = this.convertDocuments<Company>(querySnapshot.docs);
      console.log(results);
    });
}


convertDocuments<T>(docs) {
    return <T[]>docs.map(doc => {
      return {
        id: doc.id,
        ...doc.data()
      };
    });
}

export function convertSnaps<T>(snaps) {
  return <T[]>snaps.map(snap => {
    const data = convertDocTimeStampsToDate(snap.payload.doc.data());
    return {
      id: snap.payload.doc.id,
      ...data
    };
  });
}

【问题讨论】:

    标签: google-cloud-firestore angularfire2


    【解决方案1】:

    我让它像下面这样工作,我想我仍然对承诺有所了解。

    任何更好的解决方案都会被接受,因为我还在学习,不知道这是否是最好的方法。

    getCompanies2(searchText: string, useWhereActive: boolean) {
        let query = this.db.collection('companies').ref
          .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');
    
        if (useWhereActive) {
          query.where('active', '==', true);
        }
    
        return query.get().then(querySnapshot => {
          return this.convertDocuments<Company>(querySnapshot.docs);
        });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2021-11-02
      • 2014-12-18
      • 1970-01-01
      • 2019-12-30
      • 2021-02-07
      • 1970-01-01
      相关资源
      最近更新 更多