如何基于Angular中使用Firestore的另一个查询的返回进行查询?

时间:2018-10-30 11:33:53

标签: angular firebase ionic3 google-cloud-firestore angularfire2

我试图从一个集合中获取一些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!
        })
    })
})

1 个答案:

答案 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中有另一种方式?

在这种情况下,我看不到其他方法。鉴于以上帖子中的信息,您可以自行决定哪种解决方案更适合您。