如何在Firebase安全规则中限制未知键嵌套对象字段值≤12?
解决方案
要在Firebase安全规则中对嵌套对象的所有随机键值进行统一限制,可以利用规则内置的every()方法遍历对象的所有键值对,结合条件判断实现通用校验。以下是针对创建和更新场景的完整规则:
创建规则(初始值校验)
创建时需确保dataObj的所有键对应的值都是1,且不超过12:
match /data-uses/{userId}/generalData/{subUserId} { allow create: if request.resource.data is map && request.resource.data.dataObj is map && // 校验dataObj中所有键的值都等于1且不超过12 request.resource.data.dataObj.every((key, value) => value == 1 && value <= 12 ); }
更新规则(增量与最大值校验)
更新时需确保:
- 仅修改已存在的键(或新增键时初始值为1)
- 修改后的值是原数值+1
- 最终值不超过12
match /data-uses/{userId}/generalData/{subUserId} { allow update: if request.resource.data is map && request.resource.data.dataObj is map && // 遍历更新后的dataObj所有键值对 request.resource.data.dataObj.every((key, newValue) => // 情况1:原文档已存在该键,校验增量和最大值 (resource.data.dataObj.exists(key) && newValue == resource.data.dataObj[key] + 1 && newValue <= 12) || // 情况2:新增键,值必须为1 (!resource.data.dataObj.exists(key) && newValue == 1) ); }
关键说明
every((key, value) => ...):遍历对象的每个键值对,只有所有元素都满足条件时返回trueexists(key):检查原文档中是否存在指定键,区分更新已有键和新增键的场景- 全程保留
value <= 12的限制,确保无论创建还是更新,最终值都不会超过阈值
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

