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

问题描述:

In Cloud Firestore规则 - 我有一个文档,名为task,我想查看某些数据(assignee字段)是否为空/不存在。在云Firestore规则中 - 如何检查密钥是否为空

我已经试过:

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

从文档 - 它指出,这确实创建一个错误: // Error, key doesn't exist allow read: if resource.data.nonExistentKey == 'value';

+0

以下是完整的规则文件 - https://github.com/Metaburn/doocrate/blob/master/firestore.rules 据我所知'resource'是一个文档,因为我使用'匹配/任务/ {anyTask} {' 从资源上的firebase文档 - https://firebase.google.com/docs/firestore/reference/security/#resource_1 –

+0

我不需要检查文档 - 我知道文档在那儿。 我想检查该文档中的字段。 因此对于'/ tasks/my-task' - 'tasks'是集合。 'my-task'是文件。并且里面有一个字段'assignee' - 我想看看它是否为空,我不能 –

+0

有一个'resource.data.keys()'函数,尝试使用'hasAll(['assignee'] )'而不是。 – Callam

阅读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,我们必须首先获得键值,如here所示的值列表。

!resource.data.keys().hasAll(['assignee']) 
+0

应该'!('asignee'in resource.data.keys())'也工作吗?另外需要注意的是,从规则文档: “请求中没有提供的资源中的字段被添加到'request.resource.data'。规则可以通过比较'request'来测试字段是否被修改。 resource.data.foo'知道'resource.data.foo'知道'resource'中的每个字段也将出现在'request.resource'中,即使它没有在写请求中提交。“,所以可能有密钥存在的时间,你不期待它... – menehune23