获取文档firestore flutter中的某些字段

Max*_*out 2 dart firebase google-cloud-platform flutter google-cloud-firestore

我目前正在开发一个应用程序,用户可以在其中创建组并邀请其他人加入其中。我希望同一组中的人能够看到他们的名字和姓氏。为此,我有一个名为“用户”的集合,其中每个用户都有一个包含其所有个人数据的文档,例如名字和姓氏、电话、职位……我还有另一个名为“组”的集合,其中我的所有组存储其名称和包含成员 ID 的数组。

当用户打开应用程序时,将完成第一个请求以请求他的组(他收到组名称和成员数组)。之后,如果他想知道某个组中的用户,则发出另一个请求,仅搜索所有成员的名字和姓氏。

因此,我想象有一个查询只会返回我想要检索的字段,并且有一条规则允许拒绝潜在的黑客访问整个用户文档,除非该用户是该文档的所有者该文件。

// For retrieving my user's groups
Stream<List<Group>?> get organizations {
  return firestore
    .collection('Groups')
    .where('members', arrayContains: this.uid)
    .snapshots()
    .map(_groupsFromSnapshot);
}
Run Code Online (Sandbox Code Playgroud)
// For retrieving names of the members of a group
Stream<List<Member>?> getMembers(Group group){
  return firestore
    .collection('Users')
    // and i dont know what to do here ...
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*nec 6

使用客户端 SDK 和 Flutter 插件,不可能仅获取文档字段的子集。当您获取文档时,您将获得它及其所有字段。

如果您只想获取文档字段的子集,可以实现以下两种方法:

  1. 对数据进行非规范化:您创建另一个集合,其中包含仅包含您要公开的字段的文档。您需要同步两个集合(Users集合,即“主”集合和新集合):为此,使用云函数是很常见的。另请注意,最好对两个集合中的链接文档使用相同的 documentID。
  2. 使用Firestore REST API获取数据:使用 REST API,您可以DocumentMask在使用方法获取一个文档时使用 a get,或者Projection在查询集合时使用 a。或DocumentMaskProjection“将对文档的获取操作限制为其字段的子集”。您可以使用该http从 Flutter 应用程序调用 API。

但是,如果您想保护其他用户数据,第二种方法无效:恶意用户可以使用相同的请求调用 Firestore REST API,但不带DocumentMaskProjection. 换句话说,如果您只是想最大限度地减少网络流量,而不是想对文档的某些字段保密,那么这种方法很有趣。

因此,对于您的特定用例,您需要采用第一个解决方案。