如何使用rxjs连接两个集合



我有两个集合(令牌和趋势(,它们必须由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是否是正确的运算符,或者是否存在任何其他问题阻止订阅的函数检索数据。

通过使用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;
}

最新更新