我正在尝试在Angular的Firebase库Angularfire中找到某个文档。我有一个可观察的对象,它返回了正确的文档ID,我正在订阅该可观察的对象,并使用内部的ID来获取文档上的所有数据,这也作为可观察的对象返回。
getSessions(date: firestore.Timestamp) {
this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().subscribe(docRef => {
return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
})
}
首先,我目前的尝试是获取我想要的文档的ID。这是我订阅的第一个观察者。在此订阅中,我使用ID来获取嵌套的sessions
集合。 this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
完全可以满足我的需求,但是如果我尝试返回此值,则接收方法将仅获得undefined
值。这让我感到不同步。
[我看过一些建议使用switchMap
的帖子,但我也没有尝试这样做。
getSessions(date: firestore.Timestamp) {
this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().pipe(switchMap(docRef => {
return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
}))
}
作为参考,collection
方法始终返回一个可观察值。如果我自己在所有订阅之外运行最内层的行,它将返回一个可观察到的内容,并且可以很好地完成我所需的行为。
我认为switchMap
应该可以正常工作,但是您必须在函数中返回observable。
getSessions(date: firestore.Timestamp) {
// !! check out the first return here !!
return this.db.collection('days', ref => ref.where('date', '==', date)).snapshotChanges().pipe(switchMap(docRef => {
return this.db.collection('days').doc(docRef[0].payload.doc.id).collection('sessions').valueChanges();
}))
}
...
this.getSessions(...).subscribe(data => { console.log(data) });