如何获取 Firestore 文档大小?

cbd*_*per 14 firebase google-cloud-firestore

Firestore docs 中,我们得到Firestore 文档最大大小是:

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

我如何知道单个文档的当前大小,以检查我是否接近 1mb 限制?

例子:

var docRef = db.collection("cities").doc("SF");

docRef.get().then(function(doc) {
    if (doc.exists) {
        console.log("Document data:", doc.data());
        // IS THERE A PROPERTY THAT CAN DISPLAY THE DOCUMENT FILE SIZE?
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 12

用于计算文档大小的计算在此处有完整记录。那里有很多文字,所以请导航到那​​里阅读。在这里复制所有文本是不值得的。

如果您必须在文档增长时手动计算其大小,我的观点是您可能没有对数据进行可扩展的建模。如果您有可以无限增长的数据列表,您可能不应该使用列表字段,而是将该数据放在新集合或子集合中的文档中。此规则有一些例外,但一般来说,您不必担心计算客户端代码中文档的大小。

  • 这是一个双刃剑,我们必须在担心不断增长的文档大小和不断增长的文档数量之间做出选择。将数据添加到一份文档中会节省检索时间和成本(读取一份文档的成本),但我们必须担心文档的大小。虽然将数据拆分为多个文档有助于避免文档大小限制,但会增加检索时间和成本(读取多个文档的成本)。IMO,文档元数据中应该有一个用于文档大小的属性。 (6认同)
  • 有计划发布这些估计的代码吗?对于社区来说,这将是一件好事。 (5认同)
  • 在某些情况下,拥有此类数据将非常有用。例如,在具有大量交换的聊天应用程序的情况下,可以将消息批处理为更少的文档,以提高读取性能,直至达到安全值。对于从 Firestore 加载单个响应的聊天应用程序,Angular 中聊天历史记录的当前加载时间还有很多不足之处。 (5认同)

Ale*_*ks 7

我发布了一个 npm来计算 Firestore 文档的大小。

其他像sizeofobject-sizeof那样计算 JS 对象大小的包不会给你一个精确的结果,因为 Firestore 中的一些原语具有不同的字节值。例如,Js 中的 boolean 存储在 4 个字节中,在 Firestore 文档中存储为 1 个字节。Null 是 0 个字节,在 Firestore 中它是 1 个字节。

除此之外,Firestore 还拥有自己独特的固定字节大小的类型:地理点、日期、参考。

引用是一个大对象。像这样的包sizeof将遍历 Reference 的所有方法/属性,而不是在这里做正确的事情。即对文档名称的字符串值 + 其路径 + 16 个字节求和。此外,如果 Reference 指向父 doc ,sizeof或者object-sizeof不会在此处检测到循环引用,这可能比不正确的大小带来更大的麻烦。


Ale*_*amo 7

对于想要根据最大1 MiB(1,048,576 字节)配额检查文档大小的 Android 用户,我制作了一个库,可以帮助您计算:

这样,您就可以始终保持在限制之下。这个库背后的算法是在关于Storage Size的官方文档中解释的算法。


cut*_*iko 6

我正在查看 Firebase 参考,期望元数据具有属性,但它没有。你可以在这里查看

所以我的下一个方法是将物体的重量计算为近似值。该整型尺寸库似乎有其合理的API。

所以它会是这样的:

sizeof.sizeof(doc.data());
Run Code Online (Sandbox Code Playgroud)

我不会使用文档快照,因为它包含元数据,就像有待处理的保存一样。另一方面,在某些情况下,高估可能会更好。

[更新] 感谢道格史蒂文森的精彩见解

所以我很好奇实际会有多少差异,所以我用我笨重的 js 做了一个肮脏的比较,你可以在这里看到演示

考虑这个对象:

 {
  "boolean": true,
  "number": 1,
  "text": "example"
  }
Run Code Online (Sandbox Code Playgroud)

并打折id这是结果:

| Method  | Bytes |
|---------|-------|
| FireDoc | 37    |
| sizeOf  | 64    |
Run Code Online (Sandbox Code Playgroud)

所以 sizeOf 库可能是一个很好的预测器,如果我们想高估(假设计算很好并且对于更复杂的实体或多或少地表现相同)。但正如评论中所解释的,这是一个粗略的估计