开发指南

API 文档

系统函数

最近更新时间:2021-04-22 15:51:06

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

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"
    }

限制

  1. get 参数中存在的变量 doc 需要在 query 条件中以 == 或 in 方式出现,若以 in 方式出现,只允许 in 唯一值, 即 doc.shopId in array, array.length == 1
  2. 一个表达式最多可以有 3 个 get 函数,最多可以访问 10 个不同的文档。
  3. 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,以减少对数据库资源的消耗,合并程度与规则的复杂程度与写法有关)。