unicloud JQL数据库操作介绍

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指定当前执行数据库操作的用户身份。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

与结构数列顺序有关的两个方程组

已知一组4点的结构数列顺序为, 方程组41 (5*x1)/5.0r1 (2*x23*x3)/5.0r2 (4*x21*x8)/5.0r3 (3*x32*x5)/5.0r4 (5*x5)/5.0r5 (4*x31*x14)/5.0r6 (1*x13*x41*x16)/5.0r7 (2*x32*x71*x10)/5.0r8 (2*x53*x7)/5.0r9 (2*x23*x10)/5.0r10 (2*x42*x91*x11)/5.0r11…

Vue 中使用 v-for 渲染列表时绑定 key 的重要性

在 Vue.js 中,v-for 是一个常用的指令,用于渲染列表数据到页面上。然而,在使用 v-for 渲染列表时,绑定一个 key 是至关重要的实践之一。本文将详细介绍为什么在 Vue 中使用 v-for 渲染列表时绑定 key 是如此重要,并深入…

迅为iTOP-RK3588开发板Buildroot系统功能测试

第三章 Buildroot系统功能测试 烧写buildroot系统镜像,buildroot系统镜像在网盘资料“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\06_iTOP-RK3588开发板Linux镜像\01_Buildroot镜像”目录下,本小节测试buildroot系统。 3.1系统启动 Buildroot系…

Qt_vc++崩溃日志分析

环境 Clion :2019.3.6 Qt :5.9.6(vc2015) 编译工具:vs2015 update3 崩溃日志收集 自行百度,会查到很多,一下代码仅供参考(来自https://blog.csdn.net/weixin_45571586/article/…

蓝桥杯-特殊日期

代码及思路详解 #include <iostream> using namespace std; int func(int n) {int sum0; while(n){sumn%10;n/10;//d得到每一位的数 }return sum; } int main() {int count0;int year,month,days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(year1900;year<999…

2024年腾讯云学生服务器优惠价格、续费和购买流程

腾讯云学生服务器优惠活动「云校园」轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置112元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G3M公网带宽配置842.4元一年&#xff0c;腾讯云服务器网txyfwq.com分享2…

Windows系统下载安装Plex媒体服务结合内网穿透远程访问本地影音文件

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

SortedMap、NavigableMap、TreeMap介绍和使用

SortedMap、NavigableMap、TreeMap介绍和使用 SortedMap接口&#xff1a;SortedMap是一个接口&#xff0c;继承自Map接口&#xff0c;它定义了对键值对按照键的自然顺序或自定义顺序进行排序的功能。SortedMap中的键值对是按照键的顺序排列的&#xff0c;因此可以根据键的顺序…

【原创教程】汇川PLC气缸手动功能块(入门版)制作流程

1、首先在软件中的功能块鼠标右击,选择新建(如下图所示)。 2、弹出一个对话框 ,给功能块命名 ,然后确定(如下图所示)。 3、功能块(FB)中会多一个气缸手动功能块、双击进入(如下图所示)。 4、然后在功能块(FB)右边上方编辑栏定义手动所需变量(如下图所示)。 5…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…

Python打印输出Linux中最常用的linux命令之示例

一、Linux中的~/.bash_history文件说明&#xff1a; 该文件保存了linux系统中运行过的命令的历史。使用该文件来获取命令的列表&#xff0c;并统计命令的执行次数。统计时&#xff0c;只统计命令的名称&#xff0c;以不同参数调用相同的命令也视为同一命令。 二、示例代码&am…

RUST 每日一省:rust logo收集

rust的logo集合&#xff0c;看看有没有你喜欢的&#xff0c;挑一个吧&#xff1b; GitHub - XuHugo/rust-logo: Collection of logo images for all rust languages 下边只是挑选了几个&#xff0c;更多的还是看github吧。