firebase规则:获取集合的所有ID

firebase规则:获取集合的所有ID,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正在尝试在创建之前通过firebase规则验证新数据 我想检查集合“users”中新文档中字段“connections”中的所有字符串是否都是集合“connections”中文档的ID 我的方法是检查users.connections中的所有字符串是否都包含在集合连接的ID中。使用假设的getIds,它将是: match/users/{id} { allow write: if getIds(/databases/$(database)/documents/connections).ha

我正在尝试在创建之前通过firebase规则验证新数据

我想检查集合“users”中新文档中字段“connections”中的所有字符串是否都是集合“connections”中文档的ID

我的方法是检查users.connections中的所有字符串是否都包含在集合连接的ID中。使用假设的getIds,它将是:

match/users/{id} {
   allow write: if getIds(/databases/$(database)/documents/connections).hasAll(request.resource.data.connections)
}
但是,我不知道是否存在这样的函数,也不知道如何获得集合中所有ID的列表。如果有人有更好的想法,我也可以使用不同的方法


感谢您的帮助:)

在安全规则中,您尝试执行的操作是不可能的。规则不提供执行查询的方法。您可以
get()
一个文档,但仅此而已。规则也不提供迭代数组的方法,因此您将无法编写循环来单独检查每个ID。而且,即使您可以编写一个循环,每个规则求值也只能使用10个文档
get()
,因此它对大型数组不起作用

听起来你需要另一种方法来检查这个列表。这里唯一可行的解决方案是,如果列表不是数组,而是文档的子集合。然后,您可以为每个文档编写一个规则,检查是否存在其他文档。

谢谢:)我认为在每个用户文档中将连接保存为子集合会有问题,因为连接包含许多字段,并且一个连接与许多用户相关联。在子集合中为每个用户保存相同的连接可能会占用大量空间。我可以创建一个单独的文档来存储每个连接的ID,然后将其用于比较。