Firebase:减少大型集合的读取次数

Pet*_*995 6 firebase angular google-cloud-firestore

经过大量搜索,我在阅读 Firebase 集合时发现了很多“不该做什么”(主要例子是 3 万美元账单事件),但是我正在努力寻找合适的解决方案我们的问题。

我们的网站包含产品目录。该目录由名为“products”的 firestore 集合填充,JSON 结构如下:

"products"{
   "productId"{
      "name":
      "price":
      "brand":
       ...
  }
}
Run Code Online (Sandbox Code Playgroud)

为了加载集合,我使用以下命令:

this.products = this.db.collection('products').valueChanges({idField: 'productID'});
Run Code Online (Sandbox Code Playgroud)

在高峰期,我们预计该系列将包含多达 2000 种产品。我担心的是,随着网站规模的扩大,这将变得极其昂贵。我注意到每次导航到“目录”页面时,它都会再次加载集合。因此,举一个有点难以想象的例子,如果页面一天加载 5000 次并加载完整集合,就像现在一样,它将导致 10,000,000 次文档读取(至少)。

我确信一定有更好的方法来做到这一点,但是,我似乎无法破解它。

非常感谢任何关于更好的方法来解决这个问题并降低成本的建议。

Fra*_*len 6

您主页的平均访问者会看到多少种产品?假设您在首屏显示 5-10 个产品,因此在它们必须滚动之前。如果 50% 的访问者立即离开页面(对于所谓的跳出来说这是一个相当乐观的值),您只需加载 5,000 次访问/天 * 10 个产品 = 50,000 次阅读即可满足一半的访问者。

留在您网站上查看更多内容的 50% 访问者实际上是值得加载更多数据的访问者。但我还是会考虑优化

对于绝大多数访问者来说,加载全部 2,000 个产品可能会造成浪费,这就是为什么 Doug 建议对数据进行分页(或者现在更常见:使用无限滚动视图加载它们)。

更有效的替代方案是将最初的 10 个产品存储到单个文档中,本质上是存储预先聚合的内容。如果您这样做,则每个访问者只需阅读一份文档即可获得初始产品。然后您可以像以前一样按需加载其余文档。

您可以进一步采用这种方法并预先聚合多种类型的内容,例如每个类别中最受欢迎的产品、特定产品的相关产品等。虽然每个步骤都会使生成内容变得更加棘手,但您可以轻松获得它如果您有更多访客,请回来。

要了解有关此内容以及使用 Cloud Firestore 时的许多其他注意事项的全部信息,我建议您观看精彩的视频系列《了解 Cloud Firestore》


Dou*_*son 5

你可以:

  1. 使用浏览器的本地存储实现您自己的本地缓存,并根据您的喜好进行处理。
  2. 启用离线持久性并使用source options将我们的查询定向到缓存。
  3. 使用分页可以避免一次加载整组结果。