2025年unicloud JQL数据库操作介绍

unicloud JQL数据库操作介绍JQL 数据库操作 JQL 全称 javascript query language 是一种 js 方式操作数据库的规范 JQL 大幅降低了 js 工程师操作数据库的难度 比 SQL 和传统 MongoDB API 更清晰 易掌握 JQL 支持强大的 DB Schema 内置数据规则和权限 DB Schema 支持 uni id

大家好,我是讯享网,很高兴认识大家。

JQL数据库操作

JQL,全称 javascript query language,是一种js方式操作数据库的规范。

  • JQL大幅降低了js工程师操作数据库的难度,比SQL和传统MongoDB API更清晰、易掌握。
  • JQL支持强大的DB Schema,内置数据规则和权限。DB Schema 支持uni-id,可直接使用其角色和权限。无需再开发各种数据合法性校验和鉴权代码。
  • JQL利用json数据库的嵌套特点,极大的简化了联表查询和树查询的复杂度,并支持更加灵活的虚拟表。

jql的诞生背景

传统的数据库查询,有sql和nosql两种查询语法。

  • sql是一种字符串表达式,写法形如:
select * from table1 where field1="value1" 
讯享网
  • nosql是js方法+json方式的参数,写法形如:
讯享网const db = uniCloud.database() let res = await db.collection('table').where({ 
    field1: 'value1' }).get() 

sql写法,对js工程师而言有学习成本,而且无法处理非关系型的MongoDB数据库,以及sql的联表查询inner join、left join也并不易于学习。

而nosql的写法,实在过于复杂。比如如下3个例子:

  1. 运算符需要转码,>需要使用gt方法、==需要使用eq方法

比如一个简单的查询,取field1>0,则需要如下复杂写法

const db = uniCloud.database() const dbCmd = db.command let res = await db.collection('table1').where({ 
    field1: dbCmd.gt(0) }).get() 

如果要表达或关系,需要用or方法,写法更复杂

讯享网const db = uniCloud.database() const dbCmd = db.command let res = await db.collection('table1').where({ 
    field1:dbCmd.gt(0).or(dbCmd.lt(-5)) }).get() 

而nosql的联表查询写法,比sql还复杂

sql的inner join、left join已经够乱了,而nosql的代码无论写法还是可读性,都更“令人发指”。比如这个联表查询:

const db = uniCloud.database() const dbCmd = db.command const $ = dbCmd.aggregate let res = await db.collection('orders').aggregate() .lookup({ 
    from: 'books', let: { 
    order_book: '$book', order_quantity: '$quantity' }, pipeline: $.pipeline() .match(dbCmd.expr($.and([ $.eq(['$title', '$$order_book']), $.gte(['$stock', '$$order_quantity']) ]))) .project({ 
    _id: 0, title: 1, author: 1, stock: 1 }) .done(), as: 'bookList', }) .end() 

这些问题竖起一堵墙,让后端开发难度加大,成为一个“专业领域”。但其实这堵墙是完全可以推倒的。

jql将解决这些问题,让js工程师没有难操作的数据库。

具体看以下示例

const db = uniCloud.database() // 使用`jql`查询list表内`name`字段值为`hello-uni-app`的记录 db.collection('list') .where('name == "hello-uni-app"') .get() .then((res)=>{ 
    // res 为数据库查询结果 }).catch((err)=>{ 
    // err.message 错误信息 // err.code 错误码 }) 

JQL流程图解

下图包括clientDB及云函数内使用jql扩展库的调用流程
在这里插入图片描述

JQL包含的模块

这里选择以使用了JQL完整功能clientDB为例,JQL操作数据库的流程如下
在这里插入图片描述

不同场景的区别

上述场景在新增、修改数据时都会执行数据校验,但是关于权限校验及action部分稍有不同
JQL数据库管理器:

  • 不会校验任何权限,相当于以数据库管理员的身份执行
  • 即使是admin不能读写的password类型数据也可以读写
  • 不会触发数据库触发器
  • 不可以执行action云函数

客户端clientDB:

  • 完整的权限校验,执行操作的用户不可以操作自己权限之外的数据
  • admin用户不可操作password类型的数据

云函数JQL:

  • 同clientDB,但是password类型的数据可以配置权限,默认权限是false,可以被admin用户操作。
  • 可以通过setUser指定当前执行数据库操作的用户身份。
小讯
上一篇 2025-03-08 17:28
下一篇 2025-01-23 20:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/24124.html