【问题标题】:Cloud Firestore optimized database setup for minimal read/write operationsCloud Firestore 优化数据库设置以实现最少的读/写操作
【发布时间】:2019-07-18 02:04:07
【问题描述】:

我要回答我的数据库设置方式是否会导致递归读取过多,从而成倍增加读取操作的数量。

我目前有一个用户集合,在每个用户文档中,我还有 3 个其他目录,goodsbundlesparts。例如,每个用户都有一个零件列表和一个捆绑列表。

bundles 目录中的每个文档都有一个映射数组,其中引用了每个映射中 parts 目录中的文档。

当我查询捆绑包时,我还想获取捆绑包中每个部分的详细信息。这是否需要我运行另一个onSnapshot

这是一个例子:

数据库:

  users (catalog)
    userID
      parts
        partID1
        partID2
        partID3
      bundles
        bundleID1
          title: "string",
          parts: [
            part:"/users/userID/parts/partID1,
            qty: 1
          ]
          parts: [
            part:"/users/userID/parts/partID2,
            qty: 1
          ]
          parts: [
            part:"/users/userID/parts/partID3,
            qty: 1
          ]

获取捆绑包

  initBundle(bid) {
    const path = this.database.collection('users').doc('userID').collection('bundles').doc(bid);
    path.ref.onSnapshot(bundle => {
      const partsArr = [];
      bundle.data().parts.forEach(part => {
        part.part.onSnapshot(partRef => {
          const partObj = {
            data: partRef.data(),
            qty: part.qty
          };
          partsArr.push(partObj);
        });
      });
      const bundleObj = {
        title: bundle.data().title,
        parts: partsArr
      };
      this.bundle.next(bundleObj);
    });
    return this.bundle;
  }

我为此使用 Ionic/Angular,所以当我返回项目时,它需要是一个对象数组。我正在重新创建对象以包含此init 上的每个部分。如您所见,对于捆绑包中的每个部分返回,我正在做另一个onSnapshot。这对我来说似乎不正确。

让我恍然大悟的是,我可能应该对用户进行一次调用,然后返回所有内容?但是那时我如何获得子目录?我不知道如何在不支付账单的情况下继续进行!

【问题讨论】:

  • “我只是想直接回答我的数据库设置方式是否会在读取操作上花费太多。”我建议重写您的问题,以关注您将被收取的读/写操作的数量,而不是成本(这也取决于其他因素),以及这个成本是否太多(这是主观的)。跨度>
  • @FrankvanPuffelen 谢谢,我会在这里重新写。
  • 为对价格计划极为谨慎的客户提出了一个简单的解决方案,用于优化对 Firestore 的查询。 The implementation 很简单,看看吧。

标签: javascript firebase google-cloud-firestore ionic4


【解决方案1】:

如果您使用嵌套的part.part.onSnapshot(partRef => { 侦听器,请务必管理这些侦听器。我知道三种常见的方法:

  1. 一旦您的外部onSnapshot 侦听器消失,嵌套的侦听器可能也应该停止(因为它们的数据可能不再需要)。这是一种相当简单的方法,因为您只需要整个捆绑包的一个侦听器列表

  2. 或者,您可以根据外部侦听器中每个“部分”侦听器的状态来管理每个“部分”侦听器,当“part1”从捆绑包中消失时删除该侦听器。这可以成为一种高效的解决方案,但确实需要(相当多)额外的代码。

  3. 许多开发人员使用get()s 进行嵌套文档读取,因为这意味着无需管理任何内容。

【讨论】:

  • 似乎一个快速的短期解决方案是.get() 而不是.onSnapshot()。我还不能测试,但是从 Firebase 到 Firestore,我正试图围绕额外的功能。我知道 Firestore 是一个简单的平面文件,如果我要查询用户,我天生就会得到所有的部件、捆绑包等(但没有参考)。 Firestore不是这种情况吗?我能否不只是查询用户并固有地获取该目录下的所有信息?
  • Firestore 上的读取很浅。他们只会从单个集合中读取文档,而不会从多个集合(既不是子集合也不是其他顶级集合)中读取文档。
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2022-11-24
  • 2015-01-17
  • 2011-02-24
相关资源
最近更新 更多