Javascript 如果没有数据,如何处理firebase查询

Javascript 如果没有数据,如何处理firebase查询,javascript,angular,firebase,google-cloud-firestore,angularfire,Javascript,Angular,Firebase,Google Cloud Firestore,Angularfire,我正在尝试为父集合中的每个文档获取集合及其子集合。。 编辑 fetchNewMarkets(){ this.firestore.collection('markets',ref=>{ const key=`name.ar`; 返回ref.orderBy(key).where('reviewResult','=',true); }).snapshotChanges() .烟斗( 过滤器(快照=>snapshot.length>0), 合并地图(市场=>{ 返回组合测试( (市场),, 组合测试(

我正在尝试为父集合中的每个文档获取集合及其子集合。。 编辑

fetchNewMarkets(){
this.firestore.collection('markets',ref=>{
const key=`name.ar`;
返回ref.orderBy(key).where('reviewResult','=',true);
}).snapshotChanges()
.烟斗(
过滤器(快照=>snapshot.length>0),
合并地图(市场=>{
返回组合测试(
(市场),,
组合测试(
市场地图(市场=>{
返回此.firestore.collection(`markets/${market.payload.doc.id}/products`)
.snapshotChanges().pipe(过滤器(快照=>snapshot.length>0),映射(产品=>{
退货产品;
}))
})
)
)
})、地图([市场、产品])=>{
让回归市场:市场化[];
products.forEach(prodArr=>{
returnedMarkets=markets.map(市场=>{
返回{
id:market.payload.doc.id,
…market.payload.doc.data()作为市场,
产品:prodArr
.filter(product=>product.payload.doc.ref.path==`markets/${market.payload.doc.id}/products/${product.payload.doc.id}`)
.map(产品=>{
返回{
id:product.payload.doc.id,
…product.payload.doc.data()作为MarketProduct
}作为MarketProductId
})
}市场化
})
})
控制台日志(返回的市场);
退货市场;
}))
.订阅(市场=>{
这是市场=[];
这个市场=市场;
this.newMarketsChanges$.next(this.markets);
})
}

如果数据不存在任何问题,但如果集合或子集合中没有数据,则会失败并无法访问订阅

在处理数据之前,是否可以先尝试对管道使用筛选器:

。。。
....
.snapshotChanges()
.烟斗(
过滤器(快照=>snapshot.exists),
合并地图(市场=>{。。。。。

thanx我想到了这个主意,但没有按照你的建议去做,我会试试看filter@AliMaher你修复了这个问题吗?仍然没有,但如果数据可用,我会解决它,因为没有错误。@JanHernandez如果用正常检查修复它,没有可观察项或操作符修复它;`mergeMap(markets=>{if(!markets.length){this.noDataSubject.next(true);}返回CombineTest([markets]`
  fetchNewMarkets() {
    this.firestore.collection<Market>('markets', ref => {
      const key = `name.ar`;
      return ref.orderBy(key).where('reviewResult', '==', true);
    }).snapshotChanges()
      .pipe(
        filter(snapshot => snapshot.length > 0),
        mergeMap(markets => {
          return combineLatest(
            of(markets),
            combineLatest(
              markets.map(market => {
                return this.firestore.collection<MarketProduct>(`markets/${market.payload.doc.id}/products`)
                  .snapshotChanges().pipe(filter(snapshot => snapshot.length > 0), map(products => {
                    return products;
                  }))
              })
            )
          )
        }), map(([markets, products]) => {
          let returnedMarkets: MarketId[];
          products.forEach(prodArr => {
            returnedMarkets = markets.map(market => {
              return {
                id: market.payload.doc.id,
                ...market.payload.doc.data() as Market,
                products: prodArr
                  .filter(product => product.payload.doc.ref.path === `markets/${market.payload.doc.id}/products/${product.payload.doc.id}`)
                  .map(product => {
                    return {
                      id: product.payload.doc.id,
                      ...product.payload.doc.data() as MarketProduct
                    } as MarketProductId
                  })
              } as MarketId
            })
          })
          console.log(returnedMarkets);
          return returnedMarkets;
        }))
      .subscribe(markets => {
        this.markets = [];
        this.markets = markets;
        this.newMarketsChanges$.next(this.markets);
      })
  }