firebase - 为什么firestore中的给定示例不能按照文档工作?
问题描述
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
allow write: if request.auth.uid != null &&
getAfter(
/databases/$(database)/documents/countries/$(request.resource.data.country)
).data.last_updated == request.time;
}
match /countries/{country} {
allow write: if request.auth.uid != null;
}
}
}
我尝试按如下方式执行数据库:
countries/{country}
fields : last_updated
cities/{city}
fields :Populations, country
如果我改变一个城市的人口,它应该自动更新特定国家的last_updated字段。
但它没有发生吗?我参考了本教程:事务和批量写入
解决方案
您定义的安全规则仅强制执行是否允许文档读/写;他们实际上并没有修改文档的数据。所以你的规则
match /cities/{city} {
allow write: if request.auth.uid != null &&
getAfter(
/databases/$(database)/documents/countries/$(request.resource.data.country)
).data.last_updated == request.time;
}
last_updated
只是说“如果在事务或批量写入结束时,相应国家的字段也已更新,则允许写入城市文档。”
在您的客户端代码中,您需要一个事务(或批量写入),它 (1) 写入城市文档,以及 (2) 更新国家/地区的 last_updated 时间。
推荐阅读
- xamarin - Xamarin.Forms.Maps 嵌套在 ScrollView 中。地图不可用,因为 ScrollView 正在拦截事件
- bluetooth - CC2640R2L:通过蓝牙向MCU芯片发送CCS程序
- c# - 没有 Internet 访问权限的桌面客户端应用程序中的 Azure Application Insights
- presto - Presto 任务序列化
- javascript - 在 JavaScript 中将一个数组拆分为每个子数组总和值不超过的子数组
- android - 如何在 Android Flutter 中锁定另一个应用程序?
- mysql - 在雅典娜中将具有时区偏移的字符串转换为日期时间
- c++ - 具有多重继承的 Windows C++ DLL 在引用传递时指向错误的方法
- scala - 检查字符串值是否为负数的最简洁方法?
- python - 显示目录列表的简单 Python HTTPS 服务器