firebase - Firestore:更好地了解获取其他文档时安全规则的工作原理
问题描述
我真的在挖掘 Firestore,但很难找到特定问题的答案,所以我在这里。这只是为了确保我正确理解安全规则的工作原理:)
这是我的架构:
/databases/{database}/documents/Bases/Base1 {
roles: { // map
user1: {admin: true}
},
Items: { // SubCollection
item1: {
name: "Hello World"
},
...n,
item10: {
name: "Good Bye World"
}
}
}
我希望我user1
获取 Base1 中的所有 10 个项目。查询很简单db.collection('Bases').doc('Base1').collection('Items').get()
但我也想确定 user1 是 Base1 中的管理员。所以我正在设置这个安全规则:
match /bases/{baseId}/items/{itemId}{
allow read: if request.auth != null
&& get(/databases/$(database)/documents/bases/$(baseId)).data.roles[request.auth.id].admin == true
}
哪个有效,一切都好。以下是问题:
1/ 我明白这条规则 get() 会让我读一读(我知道这很便宜)。是每个查询读取一次还是每个需要验证的文档读取一次?IE。就我而言,读了 10 次。
2/ 我假设对 1/ 的回答是读取 10 次。但是,由于我总是查询相同的 $(baseId),缓存会启动,即使不能保证,它应该会大大减少收费读取的数量(理论上 1 次读取,即使我获取 1000 个文档)?
欢迎任何其他关于如何处理这些模式的建议。我知道读取操作非常便宜,但我想了解我要去哪里:)
谢谢所以:)
解决方案
安全规则中的成本get()
仅适用于每个查询一次。它不适用于获取的每个文档。
由于您有一个查询,因此将花费一读。
推荐阅读
- python - 使用 matplotlib 在 python 上使用 netCDF
- python-3.x - 使用 python 抓取特定的维基百科表格
- ruby-on-rails - 如何隐藏 Rails 活动存储 blob URL?
- c - 如何列出目录而不包括包含dirent.h的文件?
- python - 在 setUp() 中创建异步事件是 aiounittest 的一个陷阱
- html - 防止元素改变附近元素的位置
- haskell - 如何使用 Haskell/Aeson 中的类型函数解析多态值?
- vb.net - 如何将命令行开关添加到 VB.NET WinForms 应用程序(从 CMD 运行时)?
- node.js - 如何从管理员 ui 中删除 Keystonejs 5 github repo url?
- android - 向 Firebase 中的所有用户推送通知