流水线查询规则支持的主要目标是与现有规则引擎的过滤功能匹配。虽然流水线查询提供了一组丰富的功能,但规则引擎仅限于识别简单过滤条件,以确保查询的可满足性和安全性。
支持的过滤表达式
如需通过规则限制查询,查询必须使用标准比较运算符与常量进行比较。规则引擎可识别以下过滤条件类型:
- 等式和不等式:
eq、neq。 - 比较:
gt、gte、lt、lte。 - 成员:
in、arrayContains
下面是一些示例:
where(eq("foo", 2))where(lt("foo", 2))documents("/user/1", "/user/2").where(...)
请求属性
您可以继续使用 request 对象来验证身份验证和查询上下文,不过流水线不支持标准查询中的某些属性。
支持的属性
新版引擎继续支持以下属性:
request.auth:访问用户 UID 和 token 数据。request.method:标识操作(例如get、list)。request.path:所访问资源的路径。request.time:请求的服务器端时间戳。
不支持的属性
由于在多阶段查询中确定这些值的复杂性,流水线规则检查不支持 request.query 属性(例如 limit、offset 和 orderBy)。
流水线阶段处理和权限
不同的流水线阶段会映射到安全规则中的特定粒度操作:
allow list权限:由collection()、collectionGroup()和database()阶段触发。allow get权限:由documents()阶段触发,该阶段的处理方式与批量get操作类似。- 字段修改阶段:规则仅对存储的数据进行操作,而不对派生值进行操作。如果流水线包含修改字段(例如
AddFields、ReplaceWith、Select)的阶段,则规则引擎在遇到该阶段后会停止应用过滤条件限制。 - 字面量阶段:
literals()阶段不从数据库读取数据,但可能会产生费用。为防止滥用,它必须与另一个可通过规则验证的阶段(例如collection())配对。