如何将多个Firestore查询分配给Observable?

时间:2018-04-21 20:57:49

标签: angular typescript firebase google-cloud-firestore

我正盯着和Firestore一起玩,到目前为止一直很好,但我不知道如何从不同的查询中检索文档并将它们分配给一个Observable,所以我的模板会自动更新。

我有一个行程集合,其中有一个 passenger 集合,用于存储每位乘客的用户ID。此ID将用于检索配置文件信息。

经过一段时间的实验,我用一个简单的数组实现了我想要的结果并推送了每个文档的数据。这是代码:

passengersIDs: AngularFirestoreCollection<{}>
passengers = []

this.passengersIDs =this.db.collection('trips').doc(this.id).collection('passengers')

this.passengersIDs.ref.get().then(data => {
     data.forEach(docu => {
     this.db.collection('profiles').doc(docu.get('passID')).ref.get().then(prof => {
        this.passengers.push(prof.data())
      })
   })
})

正如您在每个文档中看到的那样,我保存数据,然后在模板上迭代它。

我想用passengers = Obvserbale<Profile[]>或类似的东西来实现相同的行为。

我检查了angularfire2firestore documentation,但他们没有帮助。

欢迎任何帮助:)

1 个答案:

答案 0 :(得分:0)

使用rxjs Observable.fromPromise,您可以将您的承诺转换为Observable,并使用其他rxjs函数来实现您的目标。

例如:

passenger: Observable < Profile[] >  =
Observable.fromPromise(this.db.collection('trips').doc(this.id).collection('passengers'))
.pipe(switchMap(passengers =>
        // combine the array of observables to an observable of array of results
        combineLatest(  // mapping the passengers array to an Observable<Profile> array
                        passengers.map(p =>
                            Observable.fromPromise(this.db.collection('profiles').doc(p.passID))
                            )
                    )
                )
);