You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)
  2. 修改后的值是原数值+1
  3. 最终值不超过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) => ...):遍历对象的每个键值对,只有所有元素都满足条件时返回true
  • exists(key):检查原文档中是否存在指定键,区分更新已有键和新增键的场景
  • 全程保留value <= 12的限制,确保无论创建还是更新,最终值都不会超过阈值

内容的提问来源于stack exchange,提问作者Richardson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:25:20