【问题标题】:Firebase Firestore reads and pricingFirebase Firestore 读取和定价
【发布时间】: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

感谢您的帮助:)

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案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 个,您也会得到每一个。这就是我在更新的答案中提到重复数据的原因。
    猜你喜欢
    • 2023-03-12
    • 2019-10-06
    • 1970-01-01
    • 2022-01-20
    • 2018-09-09
    • 2020-11-05
    • 2021-09-25
    • 2018-07-04
    • 2019-02-01
    相关资源
    最近更新 更多