Firebase Firestore安全规则中对象列表中的筛选器/某些

Firebase Firestore安全规则中对象列表中的筛选器/某些,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,在Firestore安全规则中,我试图检查试图在一个集合中创建/删除文档的用户是否也是该对象的所有者(如在另一个集合中标记的)。基本上,我的数据如下所示: allow write: if get(...).data.userItemIds.hasAny([request.resource.id]); 在users集合中,每个用户都有这样一个文档: 在items集合(我为其编写规则)中,平台所有用户的所有项目都在那里,并且具有Firestore id,该id对应于其所有者items列表元素

在Firestore安全规则中,我试图检查试图在一个集合中创建/删除文档的用户是否也是该对象的所有者(如在另一个集合中标记的)。基本上,我的数据如下所示:

allow write: if get(...).data.userItemIds.hasAny([request.resource.id]);
  • users
    集合中,每个用户都有这样一个文档:
  • items
    集合(我为其编写规则)中,平台所有用户的所有项目都在那里,并且具有Firestore id,该id对应于其所有者
    items
    列表元素中的
    id
    键。因此,如果
    john
    创建了一个id为
    random id
    的项目,他的用户文档将如上所示,并且
    items
    集合中会有一个Firestore id为
    random id
    的新文档
我试图实现的是创建一个安全规则,其中,
集合中的文档只能在当前授权用户的用户文档(我可以使用
获取(/databases/$(database)/documents/users/$(request.auth.uid))
时更新,在其
userItems
列表中有一个元素,其
id
键等于
request.resource.id
。如果这是正常的JS,我可能会这样做:

match/items/{item}{
允许写入:如果获取(/databases/$(database)/documents/users/$(request.auth.uid))
.数据
.userItems
.some(userItem=>
userItem.id==request.resource.id
)
}
然而,Firestore非常平淡,不支持像
。一些
,甚至基本/手动循环这样的奇特操作(据我所知)。我一直在试图想出一些聪明的方法来解决这个问题,但即使是
。加入
列表并
。将结果字符串与一些奇特的RegExp匹配也行不通,因为我非常确定映射将解析为
“[对象]”
,而不是正确地进行字符串化


在不重新配置我的数据库结构的情况下,是否有任何方法可以使用标准Firestore规则执行此操作?

使用安全规则无法执行您试图执行的操作。您需要改变表示数据的方式(我建议,列表可能不是最好的表示方式),或者添加更多数据以满足您的需求

如果随机ID在列表中是唯一的,您应该考虑使用一个MAP而不是一个列表来表示它,这样您就可以对规则中可用的简单查找进行简单的查找。如果您的userItems字段是由该ID索引的映射,您可以改为说:

allow write: if get(...).data.userItems.keys().hasAny([request.resource.id]);
如果由于某种原因无法更改该字段,则需要将ID复制到新的列表字段中,并按如下方式进行检查:

allow write: if get(...).data.userItemIds.hasAny([request.resource.id]);