当前位置: 首页 > 知识库问答 >
问题:

Firestore规则-与where一起使用

东方权
2023-03-14

在我的项目中,我有firestore用户和类的集合。每个用户可以是一个或多个类的一部分。Classes文档具有属性成员,它是一个数组,包括该类中的所有用户、UID。

users documents:
doc.id: USER1UID
{ name: 'user1', email: 'user1@user1.com', phone: '+123 456 789 001' }

doc.id: USER2UID
{ name: 'user2', email: 'user2@user2.com', phone: '+123 456 789 002' }

doc.id: USER3UID
{ name: 'user3', email: 'user3@user3.com', phone: '+123 654 789 003' }

classes documents:
doc.id: ABCDEF
{ name="class1", members: ['USER1UID', 'USER2UID'] }

doc.id: GHIJKL
{ name="class2", members: ['USER1UID', 'USER3UID'] }

doc.id: MNOPQR
{ name="class3", members: ['USER3UID'] }

我需要写一个规则,将允许用户阅读关于另一个用户的详细信息,只有当他们在同一个类。每个用户也可以阅读自己的个人资料。

在本例中,user1可以读取user2和user3的详细信息。(它们一起在class1和class2中)。User2只能读取user1的详细信息(它们一起在class1中)。User3只能读取user1的详细信息(它们一起在class2中)。

我需要这样的东西:

match /users/{userId} {
   allow read: 
     //user is logged in
     if request.auth != null 
     && (
            //user can read own profile
            request.auth.id == $(userId)

            //there is a class where are both (requesting and requested) users
            || exists( (/databases/$(database)/documents/classes/).where(request.auth.id in members).where($(userId) in members)
        )
}

共有1个答案

惠文彬
2023-03-14

您试图执行的操作在数据库架构中是不可能的,因为安全规则不允许您执行查询。您一次只能使用已知路径请求一个文档,每次规则执行最多10个文档。

相反,您可以管理每个用户文档,使其包含与该用户具有共同类的所有其他用户的列表。但是您必须编写一些代码来保持更新,因为类的名册可能会随着时间的推移而变化。这可能是云函数的一个很好的用途。

 类似资料:
  • 获取错误: OnSnapshot中未捕获的错误:FirebaseError:权限缺失或不足。 下面是正在调用的函数: Firebase安全规则如下: 奇怪的是,它仍然正确地显示一切,只是触发了这个错误。为什么会这样?我忽略了吗?

  • 问题内容: 显然,整个网络上都有大量的mod重写讨论和答案。但是,我很难抓住它们。所以我想我会问这里。 这是我当前在example.com根目录下的目录结构 应用/ app / index.html(Angular js应用程序的“根”) api(这将是一个用于’api’的symfony 2应用程序。我将从这里从angular发送ajax请求。) 我想将所有请求重定向到app / index.ht

  • 将true更改为request.auth.uid!=null后,它会出现错误: 我可以弄清楚获取用户数据,比如:电子邮件和密码或用户id令牌,如何使用用户数据解决上述错误?

  • 我想检查用户的用户名和电话号码是否唯一。我已经用FirebaseFirestore实现了它。getInstance()。集合(“用户”)。whereEqualTo(“电话”,ph)。get()。addOnCompleteListener(…) 这是我的firestore规则: 代码运行良好,没有问题。我在使用方法和请求之前检查这个。啊。uid将始终为空。要使代码工作,我必须保持

  • 本文向大家介绍MySQL REPLACE()函数如何与WHERE子句一起使用?,包括了MySQL REPLACE()函数如何与WHERE子句一起使用?的使用技巧和注意事项,需要的朋友参考一下 我们知道WHERE子句用于在MySQL查询中放置条件,并且MySQL根据这些条件返回结果集。类似地,当我们将函数与WHERE子句一起使用时,结果集将取决于提供的条件。以下是使用“学生”表中的数据的示例,其中函

  • 我正在进行一个项目,在该项目中,我使用firebase函数中的express来运行使用手柄的服务器端渲染页面,一切都很正常,但当我使用firestore admin sdk时,我遇到以下错误: 我在函数/index.js文件中使用此代码 函数工作正常,但尝试const db=admin时。firestore()给了我一个错误。我还尝试了函数和firestore的模拟器,但仍然得到了相同的错误 请帮

  • 问题内容: 我有一个HTTP Spring Security配置,当我注释掉各个方面时似乎可以使用,但是当我将Spring Security规则组合在一起时它不起作用,所以我知道问题不在于或,而是与所应用的规则有关。组合。 这是我的Spring Security课程: 规则应该是… 对于所有网址,但不包括/ widget和/ assistedSearch,我们应添加SAMEORIGIN X-Fra