是Firebase规则.MapDiff意识到嵌套字段的变化吗?



查看这里的文档,我无法判断各种MapDiff操作(如#affectedKeys())是否意识到嵌套字段的变化,因为所有示例都使用高度为1的对象。

考虑以下文档变更,request.resource.data.diff(resource.data).affectedKeys()是否包含"b" ?

:

{
  "a": 1,
  "b": {
    "nested": true
  }
}

:后

{
  "a": 1,
  "b": {
    "nested": false // <-- Changed to false
  }
}

#affectedKeys()will包括嵌套值发生变化的根键

我没有意识到规则模拟器支持文字值,因此可以在不创建测试文档的情况下轻松地进行测试。根据下面的规则,get/test/1将是成功的。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    function test() {
      let before = {"a": true, "b": { "nested": true }};
      let after = {"a": true, "b": { "nested": false }};
      return before.diff(after).affectedKeys() == ["b"].toSet();
    }
    
    match /test/{t} {
      allow read: if test();
    }
  }
}

最新更新