如何获取Firestore文档的大小?

时间:2019-05-27 17:07:10

标签: 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);
});

5 个答案:

答案 0 :(得分:6)

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

通过这种方式,您将始终能够保持在限制之下。该库背后的算法是官方文档中关于Storage Size的算法。

答案 1 :(得分:1)

我在Firebase参考资料中查找,期望元数据具有属性,但没有。您可以检查它here

所以我的下一个方法是将物体的重量作为近似值。 sizeOf library似乎有一个合理的API。

所以它就像:

sizeof.sizeof(doc.data());

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

[更新]感谢道格·史蒂文森(Doug Stevenson)的精彩见解

所以我很好奇实际差异有多大,因此,通过笨拙的js,我做了一个肮脏的比较,您可以看到demo here

考虑此对象:

 {
  "boolean": true,
  "number": 1,
  "text": "example"
  }

然后将id打折,这就是结果:

| Method  | Bytes |
|---------|-------|
| FireDoc | 37    |
| sizeOf  | 64    |

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

答案 2 :(得分:1)

用于计算文档大小的计算已完全记录在here中。那里有很多文字,因此请浏览那里阅读。在这里复制所有这些文本是不值得的。

如果您必须随着文档的增长手动计算其大小,我认为您可能无法按比例缩放数据模型。如果您有可以无限增长的数据列表,则可能不应该使用列表字段,而应将数据放在文档中的新集合或子集合中。该规则有一些例外,但是通常来说,您不必担心在客户端代码中计算文档的大小。

答案 3 :(得分:1)

我已经发布了一个npm package,用于计算Firestore文档的大小。

计算JS对象大小的其他软件包,例如sizeofobject-sizeof,将不会为您提供精确的结果,因为Firestore中的某些原语具有不同的字节值。例如,Js中的布尔值以4个字节存储,在Firestore文档中为1个字节。空为0字节,在Firestore中为1字节。

此外,该Firestore具有自己的固定字节大小的唯一类型:地理位置,日期,参考。

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

答案 4 :(得分:1)

对于Swift用户,

如果您要估计文档大小,请使用以下内容。返回估计的文档大小(以字节为单位)。它不是100%准确,但可以提供可靠的估计。基本上只是将数据映射中的每个键,值转换为字符串,然后返回String + 1的总字节。有关Firebase如何确定文档大小的详细信息,请参见以下链接:https://firebase.google.com/docs/firestore/storage-size

func getDocumentSize(data: [String : Any]) -> Int{
        
        var size = 0
        
        for (k, v) in  data {
            
            size += k.count + 1
            
            if let map = v as? [String : Any]{
                size += getDocumentSize(data: map)
            } else if let array = v as? [String]{
                for a in array {
                    size += a.count + 1
                }
            } else if let s = v as? String{
                size += s.count + 1
            }
    
        }
        
        return size
        
    }