Firestore数据建模,以获取用户有权从集合中访问的x个未知数量的文档

时间:2019-07-12 20:14:21

标签: firebase google-cloud-firestore

我想要的是能够发送查询,以返回用户所在的所有团队。 uid1将返回team1,但不返回其他团队。我当前的模型不起作用,因为用户没有权限读取Teams集合中的所有文档,因此我遇到了权限问题。

“团队”集合可以包含多个团队,用户可以是多个团队的一部分。

这是我当前的消防站的组织方式:

Users:
    uid1
        firstname: xxxx
        lastname: yyyy
Teams:
     team1
         subCollection1
             ...
         subCollection2
             ...
         members
             uid1
             ...
         roles
             uid1
                 role: dev
    team2
        ...

我只能想到两种解决方案,但似乎都不是很好。

  1. 在“用户”集合中的每个用户下方都有一个列表/子集合,其中包含用户所在的所有团队。
  2. 在Teams集合内的每个文档中都有一个array类型的字段,其中包含团队成员的所有uid。 (然后使用.where(“ members”,“ array-contains”,uid))

组织数据以允许我想要的功能的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以在“用户”下创建一个子集合,然后执行collectionGroup查询以获取该团队中的所有用户,也可以通过常规查询获取该用户所在的所有团队。您只需要将teamID存储在子集合中,如果需要,还可以存储一些其他静态信息。

Users:
    uid1
        firstname: xxxx
        lastname: yyyy
        teams (collection)
             teamID (document)
             teamID (document)
    uid2
        firstname: xxxx
        lastname: yyyy
        teams (collection)
             teamID (document)
Teams:
     team1
         subCollection1
             ...
         subCollection2
             ...
         roles
             uid1
                 role: dev
      team2
          ...

现在也无需将members存储在Teams下,因为您可以通过Users集合运行所有查询,一旦拥有teamID,就可以执行无论您想要什么。

您还必须更改collectionGroup查询的权限才能使其正常工作。

例如:

rules_version = '2';
service cloud.firestore {

  match /databases/{database}/documents {

    match /{path=**}/teams/{teamID} {

      allow read: if request.auth.uid != null;

    }

    match /users/{userID}/teams/{teamID} {

      allow write: if request.auth.uid == resource.data.author;

    }
  }
}