字段访问符

业务数据都是存放在内部数据库JSONB字段里面,如何有效地访问JSON里面的指定内容呢?

属性点号访问符

$product.find({ "x.姓名": "张三", "y.审核.日期": "2025-06-06" }, { "x.姓名, wx.headimgurl 头像, x.成绩, y.审核.审核人" })

数组星号访问符

$product.find({ type: "店铺", "x.管理员.*": $c.me.id }):查找我是其中一员的店铺,即查找我管理的店铺列表。店铺管理员是个数组,星号是通配符,表示数组内的任一项。
$product.find({ type: "凭证", "x.分录.*.借方" : { $gt: 100 } }):查找借方金额大于100元的凭证。凭证分录是个对象数组,每项有科目/摘要/借方/贷方金额。

省略x.

绝大部分数据都是直接存放在x里面的,此时可以省略x.,但更深层的或者非x里面的不能省略。
$product.find({ 性别: "男" }, { "姓名, wx.headimgurl 头像, x.成绩.数学" })

原生->和->>访问符

Postgres数据库是用->访问JSONB内部结构的,返回的JSONB类型(不管它的原本属性值是什么类型);而->>则返回文本类型。
对于复杂的复合字段(带有空格/函数),平台不做额外转换,将原样传给数据库执行,此时就需要用到数据库原生的访问符了。注意,字段需要单引号括起来。
{ select: "count(*) 数量, array_agg(distinct x->'姓名') 姓名" }
{ select: "*, lag(销售额, 1) over(partition by x->'产品名称' order by x->'年月') 上月销售额" }
{ select: "学生, case x->>'科目' when '语文' then (x->'成绩')::int else 0 end 语文, case x->>'科目' when '数学' then (x->'成绩')::int else 0 end 数学" }

由众触低代码平台生成和驱动