在Cloud Firestore规则中 - 如何检查密钥是否为空

Gal*_*cha 9 firebase firebase-security google-cloud-firestore

Cloud Firestore规则中 - 我有一个调用的文档task,我想查看某些数据(assignee字段)是否为空/不存在.

我试过了:

  1. resource.data.assignee == null - 不起作用(错误)
  2. !resource.data.hasAll(['assignee']) - 不起作用(错误)

从文档中 - 它表明这确实会产生错误: // Error, key doesn't exist allow read: if resource.data.nonExistentKey == 'value';

Cal*_*lam 20

阅读公司的FireStore安全规则文档的列表比较在这里,我们可以看到,hasAll如果所有值都出现在列表返回true.

// Allow read if one list has all items in the other list
allow read: if ['username', 'age'].hasAll(['username', 'age']);
Run Code Online (Sandbox Code Playgroud)

request.resource.data是一个包含字段和值的地图.为了使用hasAll,我们必须先拿到钥匙作为值的列表如图所示这里.

!resource.data.keys().hasAll(['assignee'])
Run Code Online (Sandbox Code Playgroud)

  • `!('asignee' in resource.data.keys())` 也应该工作吗?另一件需要注意的是,来自规则文档:“资源中存在的请求中未提供的字段被添加到`request.resource.data`中。规则可以通过比较`request.resource来测试字段是否被修改。 data.foo` 到 `resource.data.foo` 知道 `resource` 中的每个字段也将出现在 `request.resource` 中,即使它没有在写请求中提交。”,所以可能有时密钥存在,您不希望它... (2认同)

小智 12

查看文档 - https://firebase.google.com/docs/reference/rules/rules.Map

k in x  - Check if key k exists in map x
Run Code Online (Sandbox Code Playgroud)

所以这应该工作(没有键())

!('assignee' in resource.data) 
Run Code Online (Sandbox Code Playgroud)


Sag*_*fek 5

如果你想确保一个键为空,你需要检查这个键是否不是资源键属性的一部分:
!resource.data.keys().hasAny(['assignee'])

您也可以使用hasAllhasOnly。更多信息在这里