- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下子集合结构:
/projects/{projectId}/documents/{documentId}
其中每个文档都有一个用于检查每个文档的安全规则的访问
映射:
{
title: "A Great Story",
content: "Once upon a time ...",
access: {
alice: true,
bob: false,
david: true,
jane: false
// ...
}
}
如何设置安全规则:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access[request.auth.uid] == true;
}
当我想查询 alice 可以跨所有项目访问的所有文档时:
db.collectionGroup("documents").where(`access.${uid}`, "==", true);
我收到一条错误消息,告诉我需要为 access.alice
、access.david
等创建集合组索引。
如何通过集合组查询克服此索引问题?
最佳答案
作为索引的快速概述,有两种类型 - 复合索引(用于将多个字段连接在一起)或单字段索引。默认情况下,对于普通集合查询,会自动为文档的每个字段创建单字段索引;对于集合组查询,则会禁用单字段索引。如果字段的值是数组,则该数组的值将添加到Array Contains索引中。如果字段的值是原始值(字符串、数字、时间戳等),则文档将添加到该字段的升序和降序索引中。
启用 access
的查询对于集合组查询的字段,必须创建索引。虽然您可以单击进行查询时收到的错误消息中的链接,但这只会为您正在查询的用户添加索引(例如 access.alice
、 access.bob
等)。相反,您应该使用 Firebase Console告诉 Cloud Firestore 为 access
创建索引(这将为每个子级创建索引)。打开控制台后,使用“添加豁免”按钮(考虑使用“豁免”来表示“覆盖默认设置”)来定义新的索引规则:
在第一个对话框中,使用以下设置:
Collection ID: "documents"
Field Path: "access"
Collection: Checked ✔
Collection group: Checked ✔
在第二个对话框中,使用以下设置:
在您的安全规则中,您还应该检查目标用户是否在 access
中在做平等之前先映射。访问丢失的属性时会抛出“对象上的属性未定义”。拒绝访问的错误,如果您稍后将语句与 ||
组合在一起,这将成为一个问题.
要解决此问题,您可以使用:
match /{path=**}/documents/{documentId} {
allow list, get: if request.auth.uid in resource.data.access
&& resource.data.access[request.auth.uid] == true;
}
或者在找不到所需的键时提供后备值:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access.get(request.auth.uid, false) == true;
}
作为违反规则的示例,假设您希望“员工”用户能够阅读文档,即使他们不在该文档的 access
中 map 。
这些规则总是会出错并失败(如果工作人员的用户 ID 不在 access
map 中):
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access[request.auth.uid] == true
|| get(/databases/$(database)/documents/users/$(request.auth.uid)).data.get("staff", false) == true;
}
然而,这些规则会起作用:
match /{path=**}/documents/{documentId} {
allow list, get: if resource.data.access.get(request.auth.uid, false) == true
|| get(/databases/$(database)/documents/users/$(request.auth.uid)).data.get("staff", false) == true;
}
顺便说一句,除非您需要查询用户无权访问的文档,否则从访问映射中忽略该用户会更简单。
{
title: "A Great Story",
content: "Once upon a time ...",
access: {
alice: true,
david: true,
// ...
}
}
关于firebase - 火存储 : How to query a map of roles inside a subcollection of documents?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68060480/
我正在使用 Cloud Firestore 并制作评论部分以便用户可以发表评论。 我在下面找到的一些代码: export function saveComment(comment, id, uid)
我正在使用 Firestore 作为 Flutter 项目的后端,数据库嵌套在文档下有子集合。结构如下: 我有从 Root 集合中找到的数据,我试图从那里获取子集合,但我不知道如何获取。 应该有可用的
我正在尝试获取子集合中的文档,该子集合是使用 .where 函数找到的文档的一部分 例子: 根目录/ 文件 A/ 子集 1 文档 1 文档 2 文档 3 子库 2 文档 文件 A/ 子集 1 文档 1
是否可以使用 iOS SDK 在文档中创建子集合?我在 API 上找不到任何合适的方法和 documentation不提供任何指南。 最佳答案 作为一般规则,您不会明确地“创建”集合。相反,您创建文档
在 Flutter Firestore 中,我这样做是为了添加一个文档: Firestore.instance .collection('groups').add({'name': 'Grou
我如何才能只阅读当前用户的评论?对于“我自己的评论”页面。我的代码已运行,但如果(其中字段:currentuid)不存在则不打印(“无数据”)。只打印 ("documents.data()")
我有以下子集合结构: /projects/{projectId}/documents/{documentId} 其中每个文档都有一个用于检查每个文档的安全规则的访问映射: { title: "A
我有以下子集合结构: /projects/{projectId}/documents/{documentId} 其中每个文档都有一个用于检查每个文档的安全规则的访问映射: { title: "A
我目前有一些访问我的 firestore 数据库的基本规则。规则详述如下。谁能帮我理解为什么第二段代码会导致权限错误?我正在尝试将图像添加到尚不存在的子集合中。谢谢 rules_version = '
我正在编写一个管理各种联盟的 react 小程序。 我遇到的问题是如何允许正确用户访问(读取、写入)联赛的比赛日。比赛日被命名为“matchday-1”、“matchday-2”等,并且是文档(比赛)
我有一个商店集合,每个商店都有一个项目的子集合。项目文档有一个属性 isAvailable,它是一个 bool 值。 然后,我需要将商品放入用户的购物车。重要的是要观察商品 isAvailable 值
我是一名优秀的程序员,十分优秀!