Firebase Firestore读取和定价

Firebase Firestore读取和定价,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我目前在firestore中收集了一些文档。每个文档都包含一个json对象数组。我认为最好将这些数组作为子集合存储在每个文档中。我唯一关心的是阅读中的子集合的定价方面 由于它目前只是每个文档上的一个数组,我相信在我获取文档时,这只算作一次读取(如果我错了,请更正我) 如果我使用一个子集合并使用下面的代码读取整个集合,这算一次读取还是多次读取?我担心这会很贵 db.collection("cities").get().then(function(querySnapshot) { query

我目前在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());
    });
});


感谢您的帮助:)

无论文档有多大,阅读一份文档都视为一次阅读。 文档中实际上没有JSON这样的东西,firebase会在后台将您的结构展平,在您看来它就像JSON。图像文档中有一个键
person

现在,person对象可以是这样的

{
  name: "Phil",
  age: 25
}
Firestore将单独保存所有字段,因此从技术上讲,您的文档现在有
person.name
person.age
字段,而不仅仅是
person
字段。 这对您来说意味着,即使在单个文档中包含复杂的对象,它仍然只是一个文档,因此被视为一次读取

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

是否使用子集合的问题可以归结为文档的大小。但这要由你来决定

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


此外,我还推荐firebase关于此主题的视频:

嗨,Philip,谢谢你的精彩回答。拥有大型文档是否存在定价问题?我的实际问题是,我有一个带有数组的文档,每个数组项都可以有用户注释。我最初关心的是刷新单个数组项注释,我必须再次阅读整个文档。。。不过,这听起来比为每个文档提供一个子集合要便宜。大型文档会导致两个问题:由于您无法部分读取文档,因此将加载所有数据,因此加载时间可能会非常长。此外,您在firestore中支付网络使用费。如果将所有注释打包到文档中,那么现在只能查询所有文档,而不能查询前10个文档。因此,如果一个项目有一百万条评论,那么每次都会加载这些评论,这会导致由于网络出口而产生的成本。如果你将评论存储在子集合中,你只需查询前x条评论-请参阅我的更新答案。根据你的答案和你发布的视频,我想我会将数组作为单个文档保存,并将评论存储在顶级集合中。这样,只需进行一次初始读取,然后他们就可以在需要时为每个数组位置加载注释(因为他们甚至可能不会查看注释)。最后一个问题是,如果每个文档存储500条评论,然后以增量方式加载它们,这是否不好?感谢您的帮助:)您无法增量加载单个文档。当您查询文档时,您会得到该文档中的任何内容。所以,如果你的文档有一百万条评论,你会得到每一条,即使你只想要5条。这就是为什么我在更新的答案中提到复制数据。