Firestore:如何根据其他集合中的现有文档筛选文档



例如,我想获得一些"空间";。

简化的Firestore规则示例:

match /users/{userId} {
allow read: if exists(/databases/$(database)/documents/spaces/SPACEID/members/$(userId));
}

网站中的JS代码:

firebaseApp
.firestore()
.collection("users")
.where( ??? )
.onSnapshot((querySnapshot) => {
...
});

我只能想出两个工作选项:

  1. /users集合中创建spacesArray字段并使用usersRef.where("spacesArray", "array-contains", "SPACEID")。但在这种情况下,任何人都可以通过阅读spacesArray来了解用户所在的组。此外,问题是这些阵列可能非常大,而客户端不需要这些数据,这会导致流量过大
  2. 首先获取空间中的所有成员列表/databases/$(database)/documents/spaces/SPACEID/members/,然后逐个获取每个用户。这个选项的问题是可能有很多用户,每次刷新页面时,都会通过.get().onSnapshot()请求成百上千的用户,这是多余的

理想的选择是从where字段中的规则中使用类似的exists(...)方法,或者出于保密目的从用户文档中过滤掉spacesArray

Firestore查询只能对查询返回的文档中的数据进行排序/筛选。无法对其他文档/集合中的信息进行排序/筛选。

因此,您在安全规则中的exists检查通常非常适合获取单个文档(在更细粒度的安全规则语法中称为get(,但不适合处理批量读取(在细粒度安全规则中称为list(。

如果您考虑用户私有信息的空间列表,请考虑将其存储在UserSpaces集合中,这(正如您在#2中所说(会导致更多的读取,或者考虑在公共数组中只存储该空间的单向散列。

最新更新