查看这里的文档,我无法判断各种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();
}
}
}