Firebase 如何获取Firestore文档大小?
从中,我们得到Firestore文档的最大大小为: 文档的最大大小1 MiB(1048576字节) 问题 我如何知道单个文档的当前大小,以检查我是否正在接近 1mb的限制 示例:Firebase 如何获取Firestore文档大小?,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,从中,我们得到Firestore文档的最大大小为: 文档的最大大小1 MiB(1048576字节) 问题 我如何知道单个文档的当前大小,以检查我是否正在接近 1mb的限制 示例: var docRef = db.collection("cities").doc("SF"); docRef.get().then(function(doc) { if (doc.exists) { console.log("Document data:", doc.data());
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);
});
我在Firebase引用中查找,希望元数据有一个属性,但它没有。你可以查一下 所以我的下一个方法是计算物体的重量作为近似值。似乎有一个合理的API 所以它会是这样的:
sizeof.sizeof(doc.data());
我不会使用文档快照,因为它包含元数据,就像有挂起的保存一样。另一方面,在某些情况下,高估可能更好
[更新]感谢Doug Stevenson的精彩见解
所以我很好奇这两者的差别到底有多大,所以我用我笨重的js做了一个肮脏的比较,你可以看到
考虑到这一目标:
{
"boolean": true,
"number": 1,
"text": "example"
}
对id
进行贴现,结果如下:
| Method | Bytes |
|---------|-------|
| FireDoc | 37 |
| sizeOf | 64 |
所以,如果我们想高估(假设计算很好,并且对于更复杂的实体,其行为或多或少相等),sizeOf库可能是一个很好的预测器。但正如评论中所解释的,这是一个粗略的估计用于计算文档大小的计算是完整记录的。那里有很多文本,所以请导航到那里阅读。把那些文字都抄在这里是不值得的 如果您必须在文档增长时手动计算文档的大小,我的观点是,您可能没有对数据进行可伸缩的建模。如果您有可以无限增长的数据列表,您可能不应该使用列表字段,而应该将该数据放在新集合或子集合的文档中。此规则有一些例外,但一般来说,您不必担心在客户端代码中计算文档的大小。我发布了一个npm,用于计算Firestore文档的大小 其他软件包,如计算JS对象大小的
sizeof
或object sizeof
,不会给出精确的结果,因为Firestore中的某些原语具有不同的字节值。例如,Js中的布尔值存储为4个字节,Firestore文档中为1个字节。Null为0字节,在Firestore中为1字节
除此之外,Firestore还有自己的固定字节大小的独特类型:地理点、日期、引用
引用是一个大对象。像
sizeof
这样的包将遍历引用的所有方法/属性,而不是在这里做正确的事情。即文档名的字符串值+指向它的路径+16个字节之和。此外,如果引用指向父文档,sizeof
或object sizeof
将不会在此处检测到循环引用,这可能比不正确的大小带来更大的麻烦。对于希望根据最大1 MiB(1048576字节)配额检查文档大小的Android用户,我制作了一个库,可以帮助您计算:
这样,您就可以始终保持在限制以下。该库背后的算法在官方文档中解释过。对于Swift用户
如果您想估计文档大小,那么我使用以下方法。返回文档的估计大小(字节)。它不是100%准确,但给出了可靠的估计。基本上只是将数据映射中的每个键、值转换为字符串,并返回字符串+1的总字节数。有关Firebase如何确定文档大小的详细信息,请参见以下链接:
是 啊我也期待着。但什么也没找到。我不相信库的大小是Firestore文档大小的准确表示。内存中JS对象的大小将不同于Firestore中持久化的文档的大小。JS对象的实现在不同的运行时之间可能会有很大的差异。我只会把那个图书馆当作一个非常粗略的估计。“我希望在大字符串值的情况下,估计值会更准确,而在有大量不同非基本类型的字段时,估计值会更不准确。@DougStevenson更新了答案,很有趣,希望对发布这些估计值的代码有帮助吗?”?这对社区来说是一件好事。在有些情况下,拥有这些数据会非常有用。例如,对于具有大量交换的聊天应用程序,可以将消息批处理到较少的文档中,以提高读取性能,达到安全值。对于从Firestore加载个人响应的聊天应用程序,Angular中聊天历史的当前加载时间还有很多需要改进的地方。它非常简单和有用。@Pooja是的,确实如此。有什么方法可以在Unity中使用此库吗?@Jay我不确定您是否可以在Unity中使用此库。从未尝试过。Firebase还包括每个文档的“32个额外字节”加上文档名的大小(默认情况下约为30个),因此,无论这个func的总数是多少,都要添加~60个字节。
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
}