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

Firestore安全规则:如何检查数组中每个值是否符合指定条件?

Firestore安全规则验证排序数组的子文档存在性

假设你的主文档位于/parent/{parentId},子集合为children,order字段是该子集合下文档ID的数组。可以通过以下规则验证数组中每个ID对应的子文档都存在:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 匹配主文档
    match /parent/{parentId} {
      allow update, create: if request.resource.data.order.every(childId => 
        exists(/databases/$(database)/documents/parent/$(parentId)/children/$(childId))
      );
      
      // 读取权限可根据实际需求调整
      allow read: if true;
    }
    
    // 子集合规则按需自定义
    match /parent/{parentId}/children/{childId} {
      allow read, write: if true;
    }
  }
}

关键说明:

  • 用request.resource.data.order获取提交的order数组,通过every()遍历每个元素
  • 调用exists()函数验证每个childId对应的子文档路径是否真实存在
  • 路径中的$(database)和$(parentId)是规则变量,用于动态匹配当前操作的数据库和主文档ID,保证路径正确性

额外注意:

  • 如果order字段是可选的,需先判断数组是否存在,避免空指针错误:
    allow update, create: if 
      (!request.resource.data.keys().has('order') || 
       request.resource.data.order.every(childId => 
         exists(/databases/$(database)/documents/parent/$(parentId)/children/$(childId))
       )
      );
    
  • 确保子集合文档ID为字符串类型,避免类型不匹配导致验证失败
  • 数组元素过多时,每个元素的存在性检查会增加规则执行开销,注意控制数组长度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:31:12