使用angularfire2获取单个文档的最简单方法

时间:2018-08-20 19:54:48

标签: google-cloud-firestore angularfire2

我正在尝试使用一种基本形式,以便我可以更新数据。 我可以查询完整的集合(并且可以选择在客户端过滤所需的数据,如果尚未对我有用的话,可以进行过滤)。

知道ID后,我可以查询一个文档。 但是我想查询具有业务标准的集合,并能够将其添加到我的视图中(当然,当表单更新时,它当然也有更新数据的方法。)

实际上,我的问题似乎与Get a single document by foreign key in using RxJs and AngularFirestore非常接近 但是:

  • 获取所有数据并在经过过滤之后对它进行过滤似乎对我来说是个糟糕的解决方案

  • 我尝试过,但是在给定的示例中,我不确定要了解allPayments和付款的含义(类型)(为此,我想如果是的话,这是一个商务舱):

    getPaymentByBookingId(id: string): Observable<Payment> {
     return this.afs.collection<Payment>('payments')
         .valueChanges()
         .pipe(
        map(allPayments=>allPayments.find(payment=>payment.bookingId === id))
       );
     }
    

我刚得到一个

    Cannot read property '<my_attribute' of undefined

假定get返回一个空值。

1 个答案:

答案 0 :(得分:2)

如您所建议,在客户端进行过滤不是实现此目的的理想方法。您需要在bookingId上查询集合,然后limit()将其查询为一个结果。

这仍将返回一个包含一个项(limit(1))的数组,但是您可以使用flatMap()展平结果以获得单个Payment

getPaymentByBookingId(id: string): Observable<Payment> {
    return this.afs
        .collection<Payment>('payments', ref => ref.where('bookingId', '==', id).limit(1))
        .valueChanges()
        .pipe(
            flatMap(payments => payments)
        );
}