从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);
});
答案 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对象大小的其他软件包,例如sizeof
或object-sizeof
,将不会为您提供精确的结果,因为Firestore中的某些原语具有不同的字节值。例如,Js中的布尔值以4个字节存储,在Firestore文档中为1个字节。空为0字节,在Firestore中为1字节。
此外,该Firestore具有自己的固定字节大小的唯一类型:地理位置,日期,参考。
参考是一个大对象。像sizeof
这样的包将遍历Reference的所有方法/属性,而不是在此处做正确的事情。这是求和一个文档名称的字符串值+它的路径+ 16个字节。另外,如果“引用”指向父文档,则sizeof
或object-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
}