Firebase 云中Firestore规则-如何检查密钥是否为空
在云Firestore规则中-我有一个名为Firebase 云中Firestore规则-如何检查密钥是否为空,firebase,firebase-security,google-cloud-firestore,Firebase,Firebase Security,Google Cloud Firestore,在云Firestore规则中-我有一个名为任务的文档,我想看看一些数据(受让人字段)是否为空/不存在 我试过: resource.data.assignee==null-不工作(错误) !resource.data.hasAll(['assignee'])-不工作(错误) 从文档中可以看出,这确实会产生错误: //错误,密钥不存在 允许读取:如果resource.data.nonExistentKey=='value'; 阅读Firestore安全规则文档的列表比较,我们可以看到,如果列表中存
任务
的文档,我想看看一些数据(受让人
字段)是否为空/不存在
我试过:
resource.data.assignee==null
-不工作(错误)!resource.data.hasAll(['assignee'])
-不工作(错误)
//错误,密钥不存在
允许读取:如果resource.data.nonExistentKey=='value';
阅读Firestore安全规则文档的列表比较,我们可以看到,如果列表中存在所有值,则hasAll
返回true
// Allow read if one list has all items in the other list
allow read: if ['username', 'age'].hasAll(['username', 'age']);
request.resource.data
是一个包含字段和值的映射。为了使用hasAll
,我们必须首先获取键作为值列表,如图所示
看看这些文件-
因此,这应该可以工作(没有键()
如果要确保密钥为空,则需要检查此密钥是否不是资源密钥属性的一部分:
!resource.data.keys().hasAny(['assignee'])
您还可以使用
hasAll
或hasOnly
。更多信息这是完整的规则文件-据我所知,resource
是一个文档,因为我使用的是match/tasks/{anyTask}{
来自资源上的firebase文档-我不需要检查文档-我知道文档在那里。我想检查文档中的字段。因此对于/tasks/my task
-tasks
是集合。我的任务
是文档。在文档中有一个字段我想查看如果它是空的或不是空的,并且我不能找到一个resource.data.keys()
函数,试着用hasAll(['assignee'])
来代替它。也许你会在!resource.data.keys().hasAll(['assignee'])
Boom@Callam你找到了。应该!('asignee'在resource.data.keys()中)
也能工作吗?另一件需要注意的事情是,规则文档:"资源中存在的请求中未提供的字段被添加到request.resource.data
。规则可以通过将request.resource.data.foo
与resource.data.foo
进行比较来测试字段是否被修改,因为知道资源中的每个字段也将出现在request.resource
即使它没有在写请求中提交。",因此,有时密钥可能存在,而您不希望它…@menehune23这是真的,如果资源中可能已经存在字段,则很难判断客户端应用程序是否未包含字段。此外,规则模拟器不支持将资源复制到请求字段,因此您可以n在模拟器中构建一个更新,它可以工作,但在真实的应用程序中无法工作…非常令人沮丧。
!resource.data.keys().hasAll(['assignee'])
k in x - Check if key k exists in map x
!('assignee' in resource.data)