Firebase Firestore 读取和定价

Posted

技术标签:

【中文标题】Firebase Firestore 读取和定价【英文标题】:Firebase Firestore reads and pricing 【发布时间】:2019-10-29 18:31:43 【问题描述】:

我目前在 Firestore 中有一组文档。这些文档中的每一个都包含一个 json 对象数组。我相信将这些数组作为子集合存储在每个文档中会更好。我唯一关心的是读取子集合的定价方面。

由于它目前只是每个文档上的一个数组,我相信当我获取文档时,这仅算作一次读取(如果我错了,请纠正我)。

如果我转而使用子集合并使用下面的代码阅读整个集合,这算作一次阅读还是多次阅读?我担心这可能很昂贵。

db.collection("cities").get().then(function(querySnapshot) 
    querySnapshot.forEach(function(doc) 
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());
    );
);

https://firebase.google.com/docs/firestore/query-data/get-data

感谢您的帮助:)

【问题讨论】:

【参考方案1】:

无论文档有多大,阅读一份文档都算作一次阅读。 文档中实际上没有 JSON 这样的东西,firebase 会在后台扁平化你的结构,它对你来说就像 JSON。图片您的文档有一个密钥person

现在 person 对象可能看起来像这样


  name: "Phil",
  age: 25

Firestore 将单独保存所有字段,因此从技术上讲,您的文档现在具有 person.nameperson.age 字段,而不仅仅是 person 字段。 这对您来说意味着即使您在单个文档中有复杂的对象,它仍然只是一个文档,因此算作一次读取。

加载子集合将计为单独读取。但是想象一下,而不是像我的person 示例中的小对象,您拥有大小为数千字节甚至兆字节的对象。每次查询文档时,您不仅会获取大量有效负载(您可能只需要其中的几个属性),而且由于网络出口,您的账单也会增加,因此额外读取一次是值得的。

是否使用子集合的问题归结为您的文档可能有多大。但这由您决定。

编辑: 对于您在评论中描述的用例,将 cmets 存储在文档本身以及子集合中可能是一个好主意。 例如,您的文档可以直接保存前 5 个 cmets,这样您的网络出口保持在较低水平,但您仍然可以立即访问最重要的 cmets。然后,如果要加载更多 cmets,可以查询子集合以获取完整的 cmets 集合。在 NoSQL 数据库中,冗余数据是允许的,有时实际上是好的。

另外我推荐firebase关于这个主题的视频:https://www.youtube.com/watch?v=o7d5Zeic63s

【讨论】:

嗨菲利普,感谢您的出色回答。拥有大型文档是否有任何定价问题?我的实际问题是我有一个包含数组的文档,每个数组项都可以有用户 cmets。我最初关心的是刷新单个数组 items cmets,我必须再次读取整个文档...但是这听起来确实比给每个文档一个子集合便宜。 大型文档会导致两个问题:由于您无法部分读取文档,所有数据都会被加载,因此加载时间可能会变得非常长。此外,您还需要为 Firestore 中的网络使用付费。如果将所有 cmets 打包到文档中,则现在只能查询所有文档,而不是前 10 个。因此,如果一个项目有一百万个 cmets,则每次都会加载这些 cmets,从而因网络出口而产生成本。如果您将 cmets 存储在子集合中,您只需查询前 x cmets - 请参阅我更新的答案。 根据您的回答和您发布的视频,我想我会将数组保留为单个文档并将 cmets 存储在***集合中。这样,只有一次初始读取,然后如果需要,他们可以为每个数组位置加载 cmets(因为他们甚至可能看不到它们)。最后一个问题,每个文档存储 500 cmets 并增量加载它们会不会很糟糕?感谢您的所有帮助:) 您不能增量加载单个文档。当您查询一个文档时,您会得到该文档中的任何内容。因此,如果您的文档有一百万个 cmets,即使您只需要 5 个,您也会得到每一个。这就是我在更新的答案中提到重复数据的原因。

以上是关于Firebase Firestore 读取和定价的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 定价 - Firebase 控制台中的 CRUD 是不是重要?

Firestore:加入与 Firestore 定价

离线缓存数据的 Firestore 定价说明

Cloud Firestore 每次读取定价

Firestore 读/写定价; .limit(25) 算作 25 次读取还是 1 次?

了解 Firestore 定价