我有以下firebase数据结构:
firebase-database-1234:
user_keywords (list)
keyword_a
keyword_b
keywords (object)
keyword_a
name
keyword_b
name
keyword_posts (list)
keyword_a
postkey1
postkey2
postkey3
keyword_b
postkey4
postkey5
posts (object)
postkey1
date_time
title
etc
postkey2
date_time
title
etc
postkey3
date_time
title
etc
postkey4
postkey5
基本上我要做的是拥有一个用户拥有用于检索帖子的标签或关键字的结构。每个user_keywords节点都有用户选择的关键字。我需要获取在关键字节点中匹配的所有关键字,以便我可以获取名称属性等。
然后我需要从keyword_posts节点获取与用户选择的关键字匹配的帖子列表。
然后我遍历每个post key属性并从posts节点获取实际的post数据。
我知道如何使用嵌套订阅和数组来做到这一点。但我真正想要的是一系列的observable,所以我基本上可以有一个observable订阅使用异步管道来获取帖子。
就我已经使用当前的数据结构而言:
getKeywordsByUser(userId: string): Rx.Observable<any[]> {
return this.af.list(`users/${userId}/filters_incoming/keywords`)
.map(user_keywords => {
return user_keywords.map(ukw => {
return this.af.object(`keywords/${ukw.$key}`);
})
})
.flatMap(res => Rx.Observable.combineLatest(res));
}
getPostsByKeywords(userId: string): Rx.Observable<any[]> {
this.keywords = [];
return this.getKeywordsByUser(userId)
.map(keywords => {
return keywords.map(keyword => {
this.keywords.push(keyword.name);
return this.af.list(`keyword_posts/keywords/${keyword.$key}/posts`, {
query: {
limitToLast: 33,
orderByKey: true
}
})
.map(post_keys => {
return post_keys.map(post_key => {
return this.af.object(`posts/${post_key.$key}`)
});
});
});
})
.flatMap(res => Rx.Observable.combineLatest(res));
}
this.getPostsByKeywords(this.user.uid)
.subscribe(sub => {
console.log('sub = ', sub);
});
它返回一个数组数组:
sub =(2)[Array(1),Array(8)] 0:[FirebaseObjectObservable] 1:(8)[FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable,FirebaseObjectObservable] length:2__proto__:阵列(0)