【发布时间】:2021-12-23 20:24:38
【问题描述】:
例如,我想获取属于某个“空间”成员的所有用户。
简化的 Firestore 规则示例:
match /users/{userId} {
allow read: if exists(/databases/$(database)/documents/spaces/SPACEID/members/$(userId));
}
网站中的JS代码:
firebaseApp
.firestore()
.collection("users")
.where( ??? )
.onSnapshot((querySnapshot) => {
...
});
我只能提出 2 个工作选项:
- 在
/users集合中创建spacesArray字段并使用usersRef.where("spacesArray", "array-contains", "SPACEID")。但在这种情况下,任何人都可以通过阅读spacesArray找出用户所在的组。此外,问题在于这些数组可能非常大,而客户端不需要这些数据,这会导致流量过多。 - 先获取空间中的所有成员列表
/databases/$(database)/documents/spaces/SPACEID/members/,然后逐个获取每个用户。这个选项的问题是可能有很多用户,每次刷新页面都会通过.get()或.onSnapshot()请求成百上千个用户,这是多余的。
理想的选择是使用where 字段中规则中的exists(...) 方法的类似物,或者出于保密目的以某种方式从用户文档中过滤掉spacesArray。
【问题讨论】:
标签: javascript node.js firebase google-cloud-firestore