Firebase Cloud Firestore 的成本优化模式:通过集合获取文档

Posted

技术标签:

【中文标题】Firebase Cloud Firestore 的成本优化模式:通过集合获取文档【英文标题】:Cost optimization patterns for Firebase Cloud Firestore: fetching documents over collections 【发布时间】:2019-03-07 15:07:26 【问题描述】:

我的目标是在使用 Firebase Cloud Firestore 时优化应用架构的成本。我了解 Cloud Firestore 的定价模型是按读/写计算的。因此,出于成本优化的目的,我正在考虑以下模式。我想知道它是“最佳实践”还是反模式。

这个想法是,每当我创建一个新文档以添加到集合中时,我都会让用户更新第二个“主文档”,其中包含文档内容的某些子集以及来自许多不同用户的许多类似文档的相同内容.

然后,当我去获取列表数据时,我不会获取集合并为从集合中读取的每个文档收取费用(多次读取),而是仅检索主文档(一次读取)。

在代码中,如下所示。

而不是这个:
db.collection("reviews")
  .get()
  .then(querySnapshot => 
    querySnapshot.forEach(doc => 
      // doc.data() is never undefined for query doc snapshots
      console.log(doc.id, " => ", doc.data());
    );
  )
我这样做:
const docRef = db.collection("reviews").doc("MasterList");

docRef.get().then(doc => 
  if (doc.exists) 
    console.log("Document data:", doc.data());
   else 
    // doc.data() will be undefined in this case
    console.log("No such document!");
  
)

这是一个成本明智的最佳做法吗?还是这是一种反模式?

【问题讨论】:

这是迄今为止最具成本效益的方法,只需关注@Alex Mamo 提到的大小限制。 谢谢,这正是我使用 Firestore(1 个月)以来一直在考虑的问题......但我完全是一个反模式解决方案,让我的代码更复杂......正如@Alex Mamo 所说,看看 Firebase 实时数据库。 我想出了一个 simple solution 给关心 Firestore 定价的客户。它利用 Cloud Firestore 缓存机制来使您想要进行的任何类型的查询受益。你可以看看。 【参考方案1】:

编辑: 2021 年 8 月 27 日

我写了一篇关于这个主题的文章以便更好地理解:

How to reduce Firestore costs?

拥有“主文档”的想法很好,因为即使您更改其中的多个属性,您也可以进行一次写入操作但是存在关于约束,documents have limits。因此,在您可以将多少数据放入文档时存在一些限制。根据关于使用和限制的官方文档:

文档的最大大小:1 MiB(1,048,576 字节)

如您所见,单个文档中的数据总量限制为 1 MiB。当我们谈论存储文本时,您可以存储几乎所有内容,但随着文档变得越来越大,请注意此限制。

Cloud Firestore 针对存储大量小文档进行了优化。因此,您应该利用此功能。即使您需要在不同的集合中复制和更新多个文档,我也建议您继续这样做。

附:如果您担心成本,还可以查看 Firebase 实时数据库并尝试将它们一起使用。工作得很好。

【讨论】:

“Cloud Firestore 针对存储大量小文档进行了优化。” Cloud Firestore 在任何集合大小以及在其限制范围内的任何文档大小都同样适用。 我想出了一个 simple solution 给关心 Firestore 定价的客户。它利用 Cloud Firestore 缓存机制来帮助您进行任何类型的查询。

以上是关于Firebase Cloud Firestore 的成本优化模式:通过集合获取文档的主要内容,如果未能解决你的问题,请参考以下文章

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

@firebase/firestore:Firestore (8.6.2):无法访问 Cloud Firestore 后端(React Js)

@firebase/firestore:Firestore (5.0.4):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应

导出 Firestore 备份数据的云功能。使用 firebase-admin 或 @google-cloud/firestore?

React Native Firebase Cloud Firestore