【问题标题】:Get Firestore collection and sub-collection document data together一起获取 Firestore 集合和子集合文档数据
【发布时间】:2023-03-18 22:51:01
【问题描述】:

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

  • 书(收藏)
    • {bookID}(包含书籍字段的文档)
      • 点赞(子收藏)
        • {userID}(文档名称为带有字段的用户 ID)

Book 集合有文档,每个文档都有一个Like 子集合。 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() 并将承诺存储在 like 字段中。后来,我在 HTML 中用async 管道读取like 值。这段代码运行良好,但获得like 值有一点延迟,因为承诺需要时间来解决。有没有办法在获取收藏价值的同时获取子收藏价值?

【问题讨论】:

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


    【解决方案1】:

    有没有办法在获取收藏价值的同时获得子收藏价值?

    如果不重新构建您的数据,则并非如此。 Firestore 查询只能考虑单个集合中的文档。唯一的例外是集合组查询,它允许您考虑具有完全相同名称的所有集合中的文档。您现在为“加入”这两个集合所做的工作可能与您将获得的一样有效。

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

    【讨论】:

      猜你喜欢
      • 2019-11-13
      • 2018-04-03
      • 2018-07-01
      • 2020-08-15
      • 2018-04-09
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多