我试图从一个集合中获取一些ID,然后尝试使用这些ID中的每一个从另一个集合中获取更多数据。到目前为止,这是我所做的:
基本上,我有一个博客应用程序,其中多个用户将可以发布文章。并说文章有分类。问题是,当用户选择要过滤的类别时,它将带给我所有在该类别中具有文章的用户(而不是带入所选类别的所有文章)。
因此,在Firestore中,我有:
categories/{categoryId}/users/{userId}
尽管{userId}中包含更多信息(例如此{categoryId}中的文章ID),但我现在仅对userId本身感兴趣。
我想做的是使用上述路径中恢复的userId,并使用它从以下路径中获取用户数据:
users/{userId}
这是我遇到的问题,不确定下一步如何进行。.我应该将ID存储在数组中,然后使用所述数组中的forEach循环向Firestore发出请求吗?我应该在 categories / {categoryId} / users / {userId} 上复制用户数据吗?也许改变我的Firestore数据结构?或许还有其他方法可以在Angular中做到这一点?
this.afs.collection<Category>('categories').doc(category.name).collection<User>('users')
.snapshotChanges().map(docChangeActionArray => {
return docChangeActionArray.map(value2 => {
return value2.payload.doc.id;
})
}).subscribe(ids => {
//WHAT TO DO HERE?
})
对于这样一个简单的问题,我深表歉意。我仍然很喜欢Angular和Firestore,但请多多帮助!
谢谢。
更新
我做了以下事情:
.subscribe(ids => {
ids.map(id => {
this.afs.collection('users').doc<User>(id).valueChanges().map(user => {
return user;
}).subscribe(user => {
console.log(user); //Got it!
})
})
})
答案 0 :(得分:0)
我想做的是使用上述路径中恢复的userId,并使用它从以下路径中获取用户数据:users / {userId}
您快到了。您需要做的是在新引用中使用从数据库中获得的用户id
。因此,在这种情况下,您需要使用嵌套的侦听器。因此,在您的第一个回调中,只需使用用户ID创建一个新引用,并像这样获取每个用户的详细信息:
return docChangeActionArray.map(value2 => {
return value2.payload.doc.id;
this.afs.collection<User>('users').doc(value2.payload.doc.id).snapshotChanges().map(/* ... */);
})
请注意,Cloud Firestore中的嵌套侦听器没有错。
我应该将ID存储在数组中,然后使用所述数组中的forEach循环向Firestore发出请求吗?
没有必要。
我应该在category / {categoryId} / users / {userId}上复制用户数据吗?也许改变我的Firestore数据结构?
这取决于您的应用程序的用例。多少复制数据与额外的数据库调用最适合您,这实际上取决于项目的要求。有关更多信息,请从此 post 中查看我的答案。
也许在Angular中有另一种方式?
在这种情况下,我看不到其他方法。鉴于以上帖子中的信息,您可以自行决定哪种解决方案更适合您。