如何根据firebase数据库中的嵌套属性读取数据?

时间:2018-01-09 03:11:23

标签: firebase-realtime-database firebase-security

我目前有一个具有以下结构的firebase数据库:

SharedGroup
 groupid1
     group: "test"
     members
        lastname,firstname@gmail,com: true
 groupid2
     group: "test new"
     members
        last,name@gmail,com: true
 groupid3
     group: "Family"
     members
         lastname,firstname@gmail,com: true
         last,name@gmail,com: false
         nobody@gmail,com: false
 groupid4
     group: "Friends"
     members
         lastname,firstname@gmail,com: true
 groupid5
     group: "Others"
     members
         nobody@gmail,com: true
Users
 9ybmUqR0SzLFA3aZSLV42nPp1lj2
     email: "last,name@gmail,com"
 lNZx6z7PZOUGUY0H3rtbFCYzmO53
     email: "lastname,firstname@gmail,com"

我想设置一个读取规则,如果SharedGroup不是成员(电子邮件设置为true),则不允许用户读取groupid。我设法建立了一个读取规则如下:

"SharedGroup" : {
  "$group_id": {
  ".read": " data.child('members').child(root.child('Users').child(auth.uid).child('email').val()).val() === true "
  }
}

如何在javascript中阅读与特定成员相关联的所有groupid?使用模拟器,我从SharedGroup读取时出错,因为我没有在该级别的任何规则。

1 个答案:

答案 0 :(得分:0)

如果用户无权访问所有项目,则无法在实时数据库中查询项目的子集。

好消息是有两种解决方法:

  1. 为Firebase设置云功能,以获取对SharedGroup / {groupId} / members / {memberEmail}的更新,并在数据库位置(如Indexes / groups / {userId)创建该组的索引或副本} / {的groupId}。

  2. 切换到Firestore。

  3. Firestore就像RTDB一样,但在大多数情况下更好 - 而且还处于测试阶段。您无需访问集合中的每个文档即可下载您有权访问的文档。将您的阅读规则设置为: allow read: if resource.data.members[request.auth.email]

    让您的查询检查members.email == true。那个 应该所有工作。

    顺便说一下,如果你能管理它,我通常建议使用userIds而不是电子邮件地址。

    任何这些方法的一个缺点是每个成员都可以看到每个其他成员是谁。如果您不想这样,则必须设置GroupMembers集合,其中每个文档都是(用户,组)对。这在概念上并不强硬,但魔鬼在于细节。您可以在a forum post I made中看到其中一些关于我称之为“访问”对象的内容。