Firestore无法创建阻止数据覆盖的规则,求正确配置方案
解决Firestore规则阻止文档被覆盖的问题
我来帮你搞定这个Firestore规则的问题——你想要避免已有的文档被覆盖,核心是要精准控制写入操作的权限,你之前的规则逻辑不仅搞反了,还忽略了文档不存在时resource对象的特殊性,所以才没生效。
为什么你的旧规则没用?
当你尝试创建新文档时,目标路径下还没有文档,此时resource是null,你访问resource.id或者resource.data.id会直接导致规则评估失败,请求被拒绝;而当你要覆盖已有文档时,request.resource.id和resource.id是完全相同的,你的规则条件request.resource.id != resource.id不满足,也会拒绝操作——等于不管是创建还是覆盖,都被禁止了,这显然不是你想要的结果。
正确的规则配置方式
根据你的需求“避免数据被覆盖”,这里提供两种常用的配置方案:
方案1:只允许创建新文档,完全禁止对已有文档的任何写入(包括更新、删除)
这种方案适合你只想添加新数据,不允许修改或删除已有数据的场景:
service cloud.firestore { match /databases/{database}/documents { match /audio/{title} { allow read; // 仅当目标路径下没有文档时,才允许写入(即仅允许创建新文档) allow write: if !resource.exists(); } } }
resource.exists()会检查当前路径是否存在文档,!resource.exists()就表示只有创建新文档的请求会被允许,任何对已有文档的写入(更新、删除)都会被拒绝。
方案2:允许创建和删除,但禁止更新(覆盖)已有文档
如果你需要保留删除文档的权限,但只想阻止覆盖更新,可以明确区分操作类型:
service cloud.firestore { match /databases/{database}/documents { match /audio/{title} { allow read; // 允许创建新文档、删除已有文档 allow create, delete; // 直接禁止更新操作(也就是禁止覆盖已有数据) allow update: if false; } } }
测试验证
配置完规则后,记得在Firestore控制台点击「发布」生效。你可以用控制台的「规则模拟器」测试两种场景:
- 测试创建新文档:应该能成功通过
- 测试更新已有文档:应该会被规则拒绝
内容的提问来源于stack exchange,提问作者Adriano Resende
相关产品推荐
相关产品推荐

