angularjs - 将 Firestore 集合和子集合文档数据放在一起

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

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

  • 书籍(集合)
    • {bookID}(包含书籍字段的文档)
      • 喜欢(子集合)
        • {userID}(文档名称为带有字段的用户 ID)

Book 集合包含文档,每个文档都有一个 Like 子集合。 Like集合的文档名称是喜欢该书的用户ID。

我正在尝试执行查询以获取最新的书籍,同时尝试从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() 并将 promise 存储在 like 字段中。后来,我在 HTML 中使用 async 管道读取 like 值。这段代码工作正常,但获取 like 值有一点延迟,因为 promise 需要时间才能得到解决。有没有办法在获取收藏值的同时获取子收藏值?

最佳答案

Is there a solution to get sub-collection value at the same time I am getting the collection value?

如果不重组您的数据,就不可能。 Firestore 查询只能考虑单个集合中的文档。唯一的异常(exception)是集合组查询,它允许您考虑具有完全相同名称的所有集合中的文档。您现在正在做的“加入”这两个集合的操作可能与您将获得的效果差不多。

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

关于angularjs - 将 Firestore 集合和子集合文档数据放在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63692347/

相关文章:

javascript - ng-bind 到 Promise 解析返回的值

node.js - 应用安全规则访问 Firebase 云存储服务器端

xcode - 没有这样的模块 'Firebase'?

ios - OneSignal 用户 ID 返回 Nil - swift

ios - 安装失败 'cordova-plugin-firebase-authentication' : undefined

angular - 模板解析错误 : 'ion-col' is not a known element:

dynamic - 在页面内动态加载 AngularJS 模板

javascript - 通过 Angular 访问对象

ios - 在 iOS 13.1 上使用输入按钮时 ionic 搜索栏不触发我的功能

javascript - 尝试在 ionic 中渲染 html