Firestore规则中多次引用同一文档是否会重复执行查询?
Firebase安全规则中重复调用
get()的优化机制 好问题!这是个很实用的细节,很多开发者都会关心规则执行的效率问题。
首先直接给你结论:在同一次规则评估请求中,多次引用同一个路径的get()调用,Firebase规则引擎会自动优化为仅执行一次文档获取操作,不会重复查询数据库。
具体解释:
当你在规则里多次写同一个get(/databases/$(database)/documents/otherStuff/$(dataId))时,规则引擎会在第一次调用时获取该文档的数据,然后将结果缓存起来。后续所有针对同一路径的get()引用,都会直接复用这个缓存的结果,不会再发起新的数据库查询请求。
举个例子,假设你写了这样的规则:
match /someData/{dataId} { allow read: if get(/databases/$(database)/documents/otherStuff/$(dataId)).data.allowRead == true && get(/databases/$(database)/documents/otherStuff/$(dataId)).data.allowEdit == false; }
这里两次调用了同一个get(),但实际上只会触发一次对otherStuff/{dataId}文档的读取,两次判断都是基于同一个缓存的文档数据来执行的。
为什么要这么设计?
Firebase这么做主要是为了控制规则执行的成本和效率。如果每次引用都重复查询,不仅会增加数据库的负载,还会延长规则评估的时间,影响客户端请求的响应速度。这个自动缓存优化,能确保规则执行既准确又高效。
需要注意的是,这个优化只针对完全相同的路径的get()调用,如果是不同路径的查询,那肯定会分别执行。另外,缓存的有效期只限于当前这一次规则评估请求,不同的客户端请求之间不会共享这个缓存。
内容的提问来源于stack exchange,提问作者MQLN
相关产品推荐
相关产品推荐

