一起获取Firestore收集和子收集文档数据

时间:2020-09-01 17:05:44

标签: angularjs firebase ionic-framework google-cloud-firestore

我的Ionic 5应用程序具有以下Firestore数据库结构。

  • 书(收藏)
    • {bookID}(带有书本字段的文档)
      • 像(子集合)
        • {userID}(文档名称作为带有字段的用户ID)

Book集合具有文档,每个文档具有Like子集合。 “喜欢”收藏的文档名称是喜欢这本书的用户ID。

我正在尝试查询以获取最新的books,同时尝试从Like子集合中获取文档,以检查我是否喜欢它。

async getBook(coll) {
  snap = await this.afs.collection('Book').ref
    .orderBy('createdDate', "desc")
    .limit(10).get();

  snap.docs.map(x => {
    const data = x.data();
    coll.push({
      key: x.id,
      data: data.data(),
      like: this.getMyReaction(x.id)
    });
  }

async getMyReaction(key) {
    const res = await this.afs.doc('Book/myUserID').ref.get();
    if(res.exists) {
    return res.data();
  } else {
    return 'notFound';
  }
}

我在这里正在用每个书ID调用方法getMyReaction()并将诺言存储在{​​{1}}字段中。稍后,我将使用HTML中的like管道读取like值。这段代码可以正常工作,但是获得async值会稍有延迟,因为承诺需要时间来解决。是否有一种解决方案可以在我获取集合值的同时获取子集合值?

1 个答案:

答案 0 :(得分:2)

有没有一种在我获得收藏价值的同时获得子收藏价值的解决方案?

并非没有重组数据的情况。 Firestore查询只能考虑单个集合中的文档。唯一的例外是集合组查询,它使您可以在名称完全相同的所有集合中考虑文档。您现在为“加入”这两个集合所做的工作可能与获得的效果差不多。

将其转换为单个查询的唯一方法是,使另一个集合与其他两个集合中的数据预先合并在一起。实际上,这在nosql数据库上很常见,称为非规范化。但是,完全由您决定是否适合您的用例。