有奖捉虫:云通信与企业服务文档专题,速来> HOT
安全规则内置一些系统级函数,系统函数提供强大的通用能力完成一些操作,开发者可以在规则表达式中直接调用实现对应的功能,以便更灵活地控制资源的访问权限。

get

static

get(path) returns document 对象
根据参数获取指定 doc 内容。

输入参数

参数
类型
说明
path
string
非空,格式为 database.集合名称.文档id 的字符串,值可以通过多种计算方式得到,例如使用字符串模板进行拼接(`database.${doc.collction}.${doc._id}`

返回值

undefined or null 表征 doc 不存在,否则为 document 对象,表征查询得到的数据。

示例

1. 用户的权限是写在一个独立的文档 , 用一个数值表示用户的权限范围:
{
"read": "get('database.test.123')[auth.uid] in [1,2,3]",
"delete": "get('xxxx')[auth.uid] == 1 && doc.user in ['ersed','sfsdf'] "
}
2. 集合 A 包含 shopId、orderId 关联关系,集合 B 包含 owner,shopId 关联关系,对集合 A 查询,希望限制只查到当前用户有权限的 shop 的订单。
{
"read:": "auth.openid in get(`database.B.${doc.shopId}`).owner"
}

限制

get 参数中存在的变量 doc 需要在 query 条件中以 == 或 in 方式出现,若以 in 方式出现,只允许 in 唯一值, 即 doc.shopId in array, array.length == 1
一个表达式最多可以有 3 个 get 函数,最多可以访问 10 个不同的文档。
get 函数的嵌套深度最多为 2, 即 get(get(path))。

说明

在未使用变量的情况下,每个 get 会产生一次读操作,在使用变量时,每个 get,每个变量值会产生一次读操作。 例如:规则 get(´database.collection.${doc._id´}).test,在查询 _.or([{_id:1},{_id:2},{_id:3},{_id:4},{_id:5}]) 下会产生 5 次读取。系统会对同 doc,同 field 的读取进行缓存(在尽可能的情况下,安全规则会合并部分同 doc 不同 field 的读取,在一次读取中获取多个 field,以减少对数据库资源的消耗,合并程度与规则的复杂程度与写法有关)。