Google cloud firestore resource.data.size()在firestore规则中是如何工作的(计算的是什么)?

Google cloud firestore resource.data.size()在firestore规则中是如何工作的(计算的是什么)?,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,TLDR:当向文档写入一些布尔值和嵌套对象时,firestore规则中的request.resource.data.size()计数是多少?不确定文档中“映射中的条目”(,)是什么意思,在规则模拟器中测试时,我的假设似乎是错误的(与request.resource.data.keys().size()的问题类似) 更长版本:Firestore规则出现问题,无法按预期更新数据(尽管在规则模拟器中进行了类似测试)。我们已经将问题缩小到可以看到这是一个规则检查request.resource.dat

TLDR:当向文档写入一些布尔值和嵌套对象时,firestore规则中的
request.resource.data.size()计数是多少?不确定文档中“映射中的条目”(,)是什么意思,在规则模拟器中测试时,我的假设似乎是错误的(与
request.resource.data.keys().size()
的问题类似)


更长版本:Firestore规则出现问题,无法按预期更新数据(尽管在规则模拟器中进行了类似测试)。我们已经将问题缩小到可以看到这是一个规则检查
request.resource.data.size()
是否等于某个数字的程度

传递到firestore
update
函数的数据示例如下

 Object {
   "parentObj": Object {
     "nestedObj": Object {
       "key1": Timestamp {
         "nanoseconds": 998000000,
         "seconds": 1536498767,
       },
     },
   },
   "otherKey": true,
 }
时间戳是通过
firebase.firestore.timestamp.now()生成的。
在规则模拟器中,这似乎可以很好地工作,但在执行此操作时,对实际数据却不起作用

let obj = {}
obj.otherKey = true
// since want to set object key name dynamically as nestedObj value,
// see https://stackoverflow.com/a/47296152/8236733
obj.parentObj = {} // needed for adding nested dynamic keys
obj.parentObj[nestedObj] = {
    key1: fb.firestore.Timestamp.now()
}

firebase.firestore.collection('mycollection')
.doc('mydoc')
.update(obj)

在其他一些规则中,我使用了规则
request.resource.data.size()==2
,这似乎是导致权限拒绝错误的规则(因为注释掉这些规则会使事情再次正常工作)。可能会认为,由于对象是用2个(顶级)键传递的,因此
request.resource.data.size()
=2,但情况显然不是这样(传递的对象中的键总数也不是这样的)(
request.resource.data.keys().size()
)也存在类似的问题。所以一个简短的问题有一个很长的例子。如果有人能帮我澄清一下这里出了什么问题,那将非常有帮助。

大约一个月前,我与firebase支持部门的最后一次通信中发现,
request.resource.data.size()
和基于时间戳的查询安全规则存在问题

我还被告知,
request.resource.data.size()
是成功写入后文档的大小。因此,如果要向一个包含4个键的文档中写入2个附加键,那么应该检查的值是6,而不是2

话虽如此,我仍然对
request.resource.data.size()
和本文档中使用的任何替代方法,如
request.resource.size()
存在问题


我的安全规则中也有一些地方似乎起了作用。我个人不知道为什么会这样。

几个小时以来一直在努力解决这个问题,现在我看到Firebase上的文档很清楚:“request.resource变量包含文档的未来状态”。因此,对于所有字段,不仅仅是发送的字段。

但实际上还有另一种方法可以只计算随request.writeFields.size()发送的字段数。属性writeFields是一个包含所有传入字段的表

注意:writeFields已弃用,可能随时停止工作,但我还没有找到任何替代品


编辑:writeFields显然不再在模拟器中工作了…

您知道有没有其他方法可以检查数据是否只包含某些键(例如,我希望检查
data.keys().hasAll(['expectedKey'])和&data.size()==1
)?我不知道。理想情况下,我希望他们只添加hasOnly()之类的内容。如果您设法找出了使数据大小正常工作所需的内容,请返回报告。@Doremee这就是您所寻求的吗@吉姆特终于来了!对于后代来说,您需要类似于
request.resource.data.keys().hasOnly(['userId','anotherField'])的内容。