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
相关产品推荐
相关产品推荐

