Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何获取Firestore文档大小?_Firebase_Google Cloud Firestore - Fatal编程技术网

Firebase 如何获取Firestore文档大小?

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());

从中,我们得到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());
        // 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
        
    }