首页 > 解决方案 > 如何从具有相关字段的 Firestore 加载多个集合?

问题描述

假设我有 2 个模型。

  1. 邮政
  2. 作者

作者如下图:

{
    authorId: 'ghr4334t',
    fullName: 'This is a post!'
    Nickname: 'Avola
}

帖子如下所示,并且将引用作者,如下所示:

{
    postId: '12fdc24',
    authorId: 'ghr4334t',
    content: 'This is a post!'
}

目前,当用户点击帖子时,为了显示所有相关信息,我加载数据如下:

getPost(postId).then(post=> {
   getAuthor(listing.uid).then((document) => {
       // update state so I have the post object and author object.
   })
})

所以上面,我加载帖子,然后加载作者。一旦我加载了它们,我终于可以构造一个自定义对象:

const finalPost = {
    author: { ...this.state.authorData },
    post: { ...this.state.postData }
}

自然地..如果我有更多引用其他集合的字段,则会有一个嵌套get.then()调用,如下所示:

getPost(postId).then(post=> {
   getAuthor(listing.uid).then((document) => {
      getSomethingElse(listing.uid).then((document) => {
         getAnother(listing.uid).then((document) => {
             // finally update state with everything.
         })
      })
   })
})

是否有更好的方法可以将相关信息一起加载而无需堆栈.then()调用?

标签: javascriptgoogle-cloud-firestorereact-redux

解决方案


不幸的是,没有更好的方法可以直接使用查询来实现您想要的。Firestore 中的查询并没有为您提供很多关于如何查询和返回数据的选项,主要是当您需要对JOIN它们执行任何类型的操作时,通过引用进行搜索,这使得工作变得不那么容易。我相信您正在做的方式是您现在拥有的最佳选择。

您可以尝试的另一种选择是使用Subcollections,您将在其中拥有一个Author子集合Post。这样,您将只处理 的引用Post,因为Author将在每个特定的文档中Post。这样,查询会更简单,如下所示。当然,这需要您修改数据库。

var messageRef = db.collection('Post').doc('Post1')
                .collection('Author').doc('Author1');

如果您仍然认为这还不够,我建议您在Google 的系统上提出功能请求, Google 开发人员将能够检查是否有可能实施一种获取数据的新方法。

让我知道这些信息是否澄清了您的疑问!


推荐阅读