jql联表查询涉及到权限的最好用上临时表

JQL联表查询的两种方法

联表查询

为方便文档描述定义以下两个概念:

  • 临时表:getTemp方法返回的结果,例:const article = db.collection('article').getTemp(),此处 article 就是一个临时表
  • 虚拟联表:主表与副表联表产生的表,例:db.collection(article, 'comment').get()

JQL于2021年4月28日优化了联表查询策略,详情参考:联表查询策略调整

JQL提供了更简单的联表查询方案。不需要学习join、lookup等复杂方法。

只需在db schema中,将两个表的关联字段建立映射关系,就可以把2个表当做一个虚拟联表来直接查询。

JQL联表查询有以下两种写法:

// 直接关联多个表为虚拟联表再进行查询,旧写法,目前更推荐使用getTemp进行联表查询
const res = await db.collection('order,book').where('_id=="1"').get() // 直接关联order和book之后再过滤// 使用getTemp先过滤处理获取临时表再联表查询,推荐用法
const order = db.collection('order').where('_id=="1"').getTemp() // 注意结尾的方法是getTemp,对order表过滤得到临时表
const res = await db.collection(order, 'book').get() // 将获取的order表的临时表和book表进行联表查询

复制代码

上面两种写法最终结果一致,但是第二种写法性能更好。第一种写法会先将所有数据进行关联,如果数据量很大这一步会消耗很多时间。

1. 这种jql查出来是空数组

db.collection('opendb-poi,uni-id-users').where(`"user_id"==$env.uid`).field("user_id._id,name").get()

原因:

JQL数据库操作 | uniCloud

权限校验

要求组成虚拟联表的各个临时表都要满足权限限制,即权限校验不会计算组合成虚拟联表之后使用的where、field

以下为一个订单表(order)和书籍表(book)的schema示例

// order schema
{"bsonType": "object","required": [],"permission": {"read": "doc.uid==auth.uid","create": false,"update": false,"delete": false},"properties": {"id": { // 订单id"bsonType": "string"},"book_id": { // 书籍id"bsonType": "string"},"uid": { // 用户id"bsonType": "string"}}
}// book schema
{"bsonType": "object","required": [],"permission": {"read": true,"create": false,"update": false,"delete": false},"properties": {"id": { // 书籍id"bsonType": "string"},"name": { // 书籍名称"bsonType": "string"}}
}

复制代码

如果先对主表进行过滤where('uid==$cloudEnv_uid'),则能满足权限限制(order表的"doc.uid==auth.uid"

const order = db.collection('order')
.where('uid==$cloudEnv_uid') // 先过滤order表内满足条件的部分
.getTemp()const res = await db.collection(order, 'book').get() // 可以通过权限校验

如果不对主表过滤,而是对虚拟联表(联表结果)进行过滤,则无法满足权限限制(order表的"doc.uid==auth.uid"

const order = db.collection('order').getTemp()const res = await db.collection(order, 'book').where('uid==$cloudEnv_uid').get() // 对虚拟联表过滤,无法通过权限校验

2. 用这种的方式查还是报错:

let where = '"user_id" == $env.uid'let opendbPoi_temp = db.collection('opendb-poi').where('"user_id"==$env.uid').getTemp()const res = await db.collection(opendbPoi_temp,'uni-id-users').where(where).field("user_id.avatar_file as avatar_file,user_id._id,_id,title,tel,address,name").get()console.log('res73', res);

3.上面这种写法确实问题很大,但是改成这种还是报错

后面改成这种就好了,联表查询涉及到权限的最好用上临时表

const db = uniCloud.database();
let opendbPoi_temp = db.collection('opendbpoi').where('"user_id"==$cloudEnv_uid').getTemp()console.log('opendbPoi_temp3', opendbPoi_temp);
let uniIdUsers_temp = db.collection('uni-id-users').field("_id,avatar_file").getTemp()
const res = await db.collection(opendbPoi_temp, uniIdUsers_temp).field("user_id.avatar_file as avatar_file,user_id._id,_id,title,tel,address,name").get()console.log('res77', res);

附带另外一篇别人写的涉及unicloud-db 联合查询的文章


 where='project_id.is_show=="show"' 副表的数据需要满足的条件

project_id 主表关联副表的主键

<unicloud-db ref='udb' v-slot:default="{data,pagination,hasMore, loading, error, options}" @error="onqueryerror":page-size="10" @load="resultData":collection='colList'where='project_id.is_show=="show"'>
</unicloud-db>


 
 官方解释:联表查询有以下两种写法,对于数据量稍大的表推荐使用多个临时表组成的数组作为collection,可以在主表的getTemp内先进行过滤减小联表时的性能消耗。

就是先过滤主表,减少数据,然后再联表

colList(){return [db.collection('bank-project-manage-auth-user').where('"user_id"==$env.uid').field('user_id,project_id').getTemp(),db.collection('bank-project-manage-project').where('"is_show"=="show"').field('_id,name,cooperation_name,status,start_time,latest_evaluation,is_show').getTemp()]
}

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/u013732449/article/details/129152484

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

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

相关文章

【MySQL数据库】 (篇一 ) 让你快速上手——新手速通版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、如何起步&#xff1f;&#x1f3c3;‍1.创建数据库&#xff1a;2.选择数据库&#xff1a;3.删除数据库&#xff1a;4.创建表&#xff1a;5.删除表&#xff…

JDK中用到了哪些设计模式

一&#xff0c;结构型模式 1&#xff0c;适配器模式 用来把一个接口转化成另一个接口 java.util.Arrays#asList() javax.swing.JTable(TableModel) java.io.InputStreamReader(InputStream) java.io.OutputStreamWriter(OutputStream) javax.xml.bind.annotation.adapters.Xml…

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…

无人机发展历史

你知道吗&#xff1f;无人机竟然已经有这么多年的历史了&#xff01;从最初的军事用途&#xff0c;到现在的民用、商用领域&#xff0c;无人机的发展简直是一部传奇&#xff01; &#x1f680; 遥想当年&#xff0c;无人机还只是军事领域的专属玩具&#xff0c;高不可攀。但如…

Linux的学习之路:12、地址空间(续)与进程的创建、终止和等待

摘要 本章将讲述上章没说的一些东西以及进程创建终止与等待 目录 摘要 一、地址空间&#xff08;续&#xff09; 二、创建 三、终止 四、等待 五、思维导图 一、地址空间&#xff08;续&#xff09; 上篇文章中介绍了地址空间&#xff0c;但是没有说为什么会有地址空间…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version systemctl status mysql apt insta…

hook某银行加固app

分析 要在未修复dex并打包情况下对其app内在类进行hook&#xff0c;单纯的hook会由于加固的问题而导致加载不到内在想hook的类。因此需要进行加载加固的classloader。 在此之前需要先了解Context 在Android中&#xff0c;只有Application、Activity以及Service有自己的Contex…

Gradle系列(3)——Gradle extension(gradle扩展),如何自定义gradle扩展,AppPlugin,AppExtension原理

文章目录 1.什么是Extensions2.如何自定义Extension3.问题来了——如何通过自定义Extension给Plugin传递数据4.BaseAppModuleExtension和AppPlugin部分原理BuildTypes是如何创建并传递数据给AppPlugin的&#xff1f;AppPlugin是如何接收数据的&#xff1f;buildTypeContainer流…

HDLbits 刷题 -- Mux256to1

Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel0 should select in[0], sel1 selects bits in[1], sel2 selects bits in[2], etc. Expected solution length: Around 1 line. 译&#xff1a; 创建一个…

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…

Linux——守护进程

在这篇文章中我介绍了关于tcp网络套接字&#xff0c;关于网络套接字编程的问题我会再次讲述一点东西&#xff0c;然后介绍关于守护进程的知识。 1. 关于网络套接字编程的一些问题 在进行套接字编程时我们一定是得先有套接字&#xff0c;并且我们在使用socket的一些接口时&…

2024年最佳游戏下载网站:6miu盘搜

2024有哪些好的游戏下载网站&#xff1f; 6miu盘搜是一款功能强大的网盘搜索工具,可以快速搜索并下载各种游戏。它支持多种搜索方式,包括游戏名称、游戏类型、发行商等,并且可以根据游戏大小进行精准搜索。用户可以通过6miu盘搜的高级搜索功能,找到自己需要的游戏,无论是在公共…

mysql开启基于位点的主从复制

MySQL的主从复制涉及至少两个MySQL实例&#xff1a;一个主库&#xff08;Master&#xff09;和一个或多个从库&#xff08;Slave&#xff09;。主库负责处理事务并记录所有变更到二进制日志&#xff08;binary log&#xff09;中&#xff0c;而从库通过读取并应用这些变更来保持…

MyBatis 源码分析 - 映射文件解析过程

1.简介 在上一篇文章中&#xff0c;我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大&#xff0c;加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来&#xff0c;独立成文&#xff0c;于是就有了本篇文章…

新标准日本语 课后练习

自学错误可能较多&#xff0c;听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習&#xff11;&#xff0d;&#xff11; &#xff11;張さんは日本の歌を歌うことができます 张先生会唱日本歌 &#xff12;小野さんは自転車に乗ることがで…

面试经典150题——跳跃游戏

面试经典150题 day9 题目来源我的题解方法一 动态规划双重循环方法二 贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;55 我的题解 方法一 动态规划双重循环 使用一个dp表记录i位置是否可达&#xff0c;然后在判断是否可达时需要看前面的nums[j]j>i&&dp…

对称加密解密

Cipher本身可以加解密byte[]&#xff0c;而且可以设定key和algorithm&#xff0c;安全性高。但是不能直接用于文本。因为UTF-8是可变长度的编码&#xff0c;有的字符需要用多个字节来表示&#xff0c;转换之后会出现byte[]数组长度、内容不一致的情况。 Base64也是对称加解密的…

设计模式代码实战-模版方法模式

1、问题描述 小明喜欢品尝不同类型的咖啡&#xff0c;她发现每种咖啡的制作过程有一些相同的步骤&#xff0c;他决定设计一个简单的咖啡制作系统&#xff0c;使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型&#xff1a;美式咖啡&#xff08;American Coffee&#…

RAID 5实训

Raid 5 配置实训 实验结构&#xff1a; 实验步骤 环境准备&#xff0c;Linux操作虚拟机下添加3个及以上的磁盘用于raid 10阵列构建所用&#xff08;本次实验4个&#xff0c;一个用于备用&#xff09;创建raid 5 磁盘阵列格式化并挂载磁盘阵列存储速度检查是否提升安全性能检查…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…