# 系统函数

安全规则内置一些系统级函数,系统函数提供强大的通用能力完成一些操作,开发者可以在规则表达式中直接调用实现对应的功能,以便更灵活地控制资源的访问权限。

# 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'] "
}
  1. 集合 A 包含 shopId、orderId 关联关系,集合 B 包含 owner,shopId 关联关系,对集合 A 查询,希望限制只查到当前用户有权限的 shop 的订单。
{
  "read:": "auth.openid in get(`database.B.${doc.shopId}`).owner"
}

# 限制

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

# 说明

  1. 在未使用变量的情况下,每个 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,以减少对数据库资源的消耗,合并程度与规则的复杂程度与写法有关)。