Firebase 云中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安全规则文档的列表比较,我们可以看到,如果列表中存

云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)