如何使用 rxjs 加入两个集合?

Posted

技术标签:

【中文标题】如何使用 rxjs 加入两个集合?【英文标题】:How to join two collections using rxjs? 【发布时间】:2021-07-21 22:35:59 【问题描述】:

我有两个必须由 id 连接的集合(令牌和趋势),这样每个返回的项目都由来自令牌和趋势集合的文档组成(趋势项目的 id 等于令牌项目的 id )。

为了合并文档,我创建了以下函数:

export interface TokenData 
    created_utc: number;
    image: string;
    name: string;


export interface usersCount 
    subscribers: number;
    visitors: number;
    timestamp: number;


export interface TrendData 
    tokenInfo: TokenData;
    users_count: usersCount[];


getTrends(): Observable<TrendData[]> 
      const tokens = this.db.collection<TrendData>('tokens').snapshotChanges()
      .pipe(map(docArray => 
        return docArray.map(doc => 
          const data: any = doc.payload.doc.data();
          return 
            id: doc.payload.doc.id,
            ...data
          ;
        );
      ));
      const trends = this.db.collection<TrendData>('trends').snapshotChanges()
      .pipe(map(docArray => 
        return docArray.map(doc => 
          const data: any = doc.payload.doc.data();
          return 
            id: doc.payload.doc.id,
            ...data
          ;
        );
      ));
      const fj = forkJoin(
        tokens: tokens,
        trends: trends
      );
      return fj.pipe(map(items => 
        return items.trends.map(trendItem => 
          return 
            tokenInfo: items.tokens.find((id) => id === trendItem.id),
            users_count: trendItem
          
        )
      ))
    

一般来说,我想加入两个 firestore 集合,但当前函数不返回任何内容,所以我不确定 forkJoin 是否是正确的运算符,或者是否有任何其他问题阻止订阅的函数检索数据。

【问题讨论】:

fj.pipe( 缺少结尾 )。不是缺少逗号,而是解析器遇到了,否则它会期望,) 【参考方案1】:

通过使用 combineLatest 而不是 forkJoin,我让它工作了:

getTrends(): Observable<TrendData[]> 
      const tokens = this.db.collection<TrendData>('tokens').snapshotChanges()
      .pipe(map(docArray => 
        return docArray.map(doc => 
          const data: any = doc.payload.doc.data();
          return 
            id: doc.payload.doc.id,
            ...data
          ;
        );
      ));
      const trends = this.db.collection<TrendData>('trends').snapshotChanges()
      .pipe(map(docArray => 
        return docArray.map(doc => 
          const data: any = doc.payload.doc.data();
          return 
            id: doc.payload.doc.id,
            ...data
          ;
        );
      ));
      const merged = combineLatest([tokens, trends]).pipe(
        map(([tokens, trends]) => 
          return trends.map(trendItem => 
            return 
              tokenInfo: tokens.find((id) => id === trendItem.id),
              users_count: trendItem
            
          )
        )
        )
      return merged;
    

【讨论】:

以上是关于如何使用 rxjs 加入两个集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular/RxJS 中合并两个 observable?

如何以 ManyToMany (RDBMS) 的形式加入两个集合 spring-data-mongodb

如何在 Angular 和 RxJs 中管理多个顺序订阅方法?

如何使用 Angular Http Interceptor 和 RxJS 刷新 JWT 令牌?

如何在 RxJS 中“等待”两个 observables

RxJs。如果我有两个 observable,如何抛出错误并继续发出值?