我想知道执行查询或跨查询时 firestore 缓存 get() 查找的安全规则评估的程度。我觉得文档虽然确实提到了缓存的发生,但没有详细说明缓存发生的时间或查询如何产生特定的读取成本。
因此,我的问题是,在请求许多文档的给定查询上,如果 get() 跨查询指向同一文档,则适用的 firestore 规则always是否会缓存 get() 的结果?
例如,我有一个图像集合,其中每个图像文档在逻辑上应该属于一个项目(即文档中的
project
字段)。我希望确保图像文档的安全,使其仅由“分配”到该项目的人员查看,因此我像这样构建数据:
图片集:
"imgxyz": {
name: "img1",
url: "xyz.com",
snapshot:"bbb",
project: "aaa",
}
"imgzyx": {
name: "img2",
url: "zyx.com",
snapshot:"bbb",
project: "aaa",
}
用户收藏:
"uid1": {
userName: "img2",
email: "zyx.com",
projects: ["aaa","bbb"],
}
然后是规则:
service cloud.firestore {
match /databases/{database}/documents {
function canViewImage() {
let userProjects = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.projects;
let requestedDocProject = request.resource.data.project;
return requestedDocProject in userProjects;
}
}
}
如上所述,如果检索到的图像文档有数千个,从安全规则成本的角度来看,像
.where("snapshot", "==", "bbb")
这样的查询将如何执行?对于提供给图像文档的所有规则评估的用户 get()
查找,我是否会产生 1 次额外读取?或者它是否等于图像文档的数量。
此外,如果单独调用查询,即
.get("imgxyz")
然后紧接着 .get("imgzyx")
,那么缓存将如何工作?
注意:我看到了这个问题,但觉得它没有充分解释安全规则何时/为何会缓存结果。
提前谢谢您!
如果 get() 在查询中针对同一文档,适用的 firestore 规则是否始终会缓存 get() 的结果?
是的。
根据上述内容,如果检索到的图像文档有数千个,那么从安全规则成本的角度来看,像 .where("snapshot", "==", "bbb") 这样的查询将如何执行?
不,安全规则不是过滤器。他们不检查所有文件。看起来像过滤器的规则实际上只要求客户端查询上存在匹配的过滤器,该过滤器使用索引来避免读取每个文档。
此外,如果单独调用查询,即 .get("imgxyz") 然后紧接着 .get("imgzyx"),那么缓存将如何工作?
不,查询之间没有缓存。规则不知道底层数据在查询之间是否发生了变化,因此它必须为每个查询再次检查每个文档。