uniCloud 云数据库(1)

目录

1:云数据库入门,基本概念了解

1.1 云数据库是关系型还是Nosql?

1.2 uniCloud 云数据库和关系型数据库的对比

1.3 官方文档传送门

2: 基本操作表 创建 

在uniCloud web控制台 进行创建

数据表的3个组成部分

通过传统方式操作数据库

获取集合的引用

集合 Collection

获取数据 get 

 添加数据 add :

doc 引用

limit 数量限制

skip 设置起始位置

对结果排序

指定返回字段

带查询条件 where()

查询指令 command

eq 等于 

gt 大于

in 在数组中

nin 不在数组中

and 且

or 或

正则则表达式查询


1:云数据库入门,基本概念了解
 

1.1 云数据库是关系型还是Nosql?

uniCloud提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档,它是 nosql
非关系型数据库。

1.2 uniCloud 云数据库和关系型数据库的对比

关系型JSON 文档型
数据库 database数据库 database
表 table集合 collection。但行业里也经常称之为“表”。无需特意区分
行 row记录 record / doc
字段 column / field字段 field
使用sql语法操作使用MongoDB语法或jql语法操作
  • 一个uniCloud服务空间,有且只有一个数据库;
  • 一个数据库可以有多个表;
  • 一个表可以有多个记录;
  • 一个记录可以有多个字段。

1.3 官方文档传送门

传送门

2: 基本操作表 创建 

在uniCloud web控制台 进行创建
 

  1. 打开 uniCloud web控制台 uniCloud控制台

  2. 创建或进入一个已存在的服务空间,选择 云数据库->云数据库,创建一个新表

比如我们创建一个简历表,名为 resume。点击上方右侧的 创建 按钮即可。

新建表时,支持选择现成的 opendb 表模板,选择一个或多个模板表,可以点击右下方按钮创建。

创建表一共有3种方式:

  1. 在web控制台创建
  2. 在HBuilderX中,项目根目录/uniCloud/database点右键新建schema,上传时创建
  3. 在代码中也可以创建表,但不推荐使用,见下

数据表的3个组成部分

每个数据表,包含3个部分:

  • data:数据内容
  • index:索引
  • schema:数据表格式定义

在uniCloud的web控制台可以看到一个数据表的3部分内容。

数据内容

data,就是存放的数据记录(record)。里面是一条一条的json文档。

record可以增删改查、排序统计。后续有API介绍。

可以先在 web控制台 为之前的 resume 表创建一条记录。

输入一个json

{"name": "张三","birth_year": 2000,"tel": "13900000000","email": "zhangsan@zhangsan.com","intro": "擅于学习,做事严谨"
}

 

创建一条新记录,是不管在web控制台创建,还是通过API创建,每条记录都会自带一个_id字段用以作为该记录的唯一标志。

_id字段是每个数据表默认自带且不可删除的字段。同时,它也是数据表的索引。

阿里云使用的是标准的mongoDB,_id是自增的,后创建的记录的_id总是大于先生成的_id。传统数据库的自然数自增字段在多物理机的大型数据库下很难保持同步,大型数据库均使用_id这种长度较长、不会重复且仍然保持自增规律的方式。

腾讯云使用的是兼容mongoDB的自研数据库,_id并非自增

插入/导入数据时也可以自行指定_id而不使用自动生成的_id,这样可以很方便的将其他数据库的数据迁移到uniCloud云数据库。

通过传统方式操作数据库

云函数中支持对云数据库的全部功能的操作。本章节主要讲解如何在云函数内通过传统api操作数据库,如需在云函数内使用JQL语法操作数据库,请参考:云函数内使用JQL语法

获取集合的引用

const db = uniCloud.database();
// 获取 `user` 集合的引用
const collection = db.collection('user');

集合 Collection

通过 db.collection(name) 可以获取指定集合的引用,在集合上可以进行以下操作

类型接口说明
add新增记录(触发请求)
计数count获取符合条件的记录条数
get获取集合中的记录,如果有使用 where 语句定义查询条件,则会返回匹配结果集 (触发请求)
引用doc获取对该集合中指定 id 的记录的引用
查询条件where通过指定条件筛选出匹配的记录,可搭配查询指令(eq, gt, in, ...)使用
skip跳过指定数量的文档,常用于分页,传入 offset
orderBy排序方式
limit返回的结果集(文档数量)的限制,有默认值和上限值
field指定需要返回的字段

查询及更新指令用于在 where 中指定字段需满足的条件,指令可通过 db.command 对象取得。

获取数据 get 

'use strict';
// 连接云数据库
const db = uniCloud.database()
exports.main = async (event, context) => {// 获取 `user` 集合的引用const collection = db.collection('users');// 读let res = await collection.get()return res
};

成功获取云数据库数据

 添加数据 add :

'use strict';
// 连接云数据库
const db = uniCloud.database()
exports.main = async (event, context) => {// 获取 `user` 集合的引用const collection = db.collection('users');// 添加 addlet res = await collection.add({name: "610",gender: "666888666"})return res
};

添加成功 

doc 引用

获取到具体的某一条制定数据

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {const collection = db.collection('users');// 读 getlet res = await collection.doc("63e0fa58e766bb6374e60247").get()return res
};

 

limit 数量限制

限制获取数据的数量

  let res = await collection.limit(2).get()

skip 设置起始位置

collection.skip(value)

参数说明

参数类型必填说明
valueNumber跳过指定的位置,从位置之后返回数据

使用示例

let res = await collection.skip(4).get()

复制代码

注意:数据量很大的情况下,skip性能会很差,尽量使用其他方式替代,参考:skip性能优化

 

对结果排序

collection.orderBy(field, orderType)

参数说明

参数类型必填说明
fieldstring排序的字段
orderTypestring排序的顺序,升序(asc) 或 降序(desc)

如果需要对嵌套字段排序,需要用 "点表示法" 连接嵌套字段,比如 style.color 表示字段 style 里的嵌套字段 color。

同时也支持按多个字段排序,多次调用 orderBy 即可,多字段排序时的顺序会按照 orderBy 调用顺序先后对多个字段排序

使用示例

let res = await collection.orderBy("name", "asc").get()

注意

  • 排序字段存在多个重复的值时排序后的分页结果,可能会出现某条记录在上一页出现又在下一页出现的情况。这时候可以通过指定额外的排序条件比如.orderBy("name", "asc").orderBy("_id", "asc")来规避这种情况

指定返回字段

collection.field()

从查询结果中,过滤掉不需要的字段,或者指定要返回的字段。

参数说明

参数类型必填说明
-object过滤字段对象,包含字段名和策略,不返回传false,返回传true

使用示例

collection.field({ 'age': true }) //只返回age字段、_id字段,其他字段不返回

复制代码

注意

  • field内指定是否返回某字段时,不可混用true/false。即{'a': true, 'b': false}是一种错误的参数格式
  • 只有使用{ '_id': false }明确指定不要返回_id时才会不返回_id字段,否则_id字段一定会返回。

带查询条件 where()

//查询 username 等于zhangsan
db.collection('user').where({username:'zhangsan',}).get()
// 查询 username 等于zhangsan 和猪八戒db.collection('user').where("username in ['zhangsan','猪八戒']").get()
//查询 username 等于zhangsan 或者_id==65814f6f652341901b75d140db.collection('user').where("username=='zhangsan' || _id=='65814f6f652341901b75d140'").get()
//查询 username 等于zhangsan 并且_id==65814f6f652341901b75d140db.collection('user').where("username=='zhangsan' && _id=='65814f6f652341901b75d140'").get()
//正则匹配 username 里面包含李四的数据db.collection('user').where("/李四/.test(username)").get()

 

 

查询指令 command

查询指令以dbCmd.开头,包括等于、不等于、大于、大于等于、小于、小于等于、in、nin、and、or。

下面的查询指令以以下数据集为例:

// goods表[{"type": {"brand": "A","name": "A-01","memory": 16,"cpu": 3.2},"category": "computer","quarter": "2020 Q2","price": 2500
},{"type": {"brand": "X","name": "X-01","memory": 8,"cpu": 4.0},"category": "computer","quarter": "2020 Q3","price": 6500
},{"type": {"brand": "S","name": "S-01","author": "S-01-A"},"category": "book","quarter": "2020 Q3","price": 20
}]

eq 等于 
 

表示字段等于某个值。eq 指令接受一个字面量 (literal),可以是 numberbooleanstringobjectarray

const dbCmd = db.command
const myOpenID = "xxx"
let res = await db.collection('articles').where({quarter: dbCmd.eq('2020 Q2')
}).get()// 查询返回值
{"data":[{"type": {"brand": "A","name": "A-01","memory": 16,"cpu": 3.2},"category": "computer","quarter": "2020 Q2","price": 2500}]
}

gt 大于

字段大于指定值。

如筛选出价格大于 3000 的计算机:

const dbCmd = db.command
let res = await db.collection('goods').where({category: 'computer',price: dbCmd.gt(3000)
}).get()// 查询返回值
{"data":[{"type": {"brand": "X","name": "X-01","memory": 8,"cpu": 4.0},"category": "computer","quarter": "2020 Q3","price": 6500}]
}

in 在数组中

字段值在给定的数组中。

筛选出内存为 8g 或 16g 的计算机商品:

const dbCmd = db.command
let res = await db.collection('goods').where({category: 'computer',type: {memory: dbCmd.in([8, 16])}
}).get()// 查询返回值
{"data":[{"type": {"brand": "A","name": "A-01","memory": 16,"cpu": 3.2},"category": "computer","quarter": "2020 Q2","price": 2500},{"type": {"brand": "X","name": "X-01","memory": 8,"cpu": 4.0},"category": "computer","quarter": "2020 Q3","price": 6500}]
}

nin 不在数组中

字段值不在给定的数组中。

筛选出内存不是 8g 或 16g 的计算机商品:

const dbCmd = db.command
db.collection('goods').where({category: 'computer',type: {memory: dbCmd.nin([8, 16])}
})// 查询返回值
{"data":[]
}

and 且

表示需同时满足指定的两个或以上的条件。

如筛选出内存大于 4g 小于 32g 的计算机商品:

const dbCmd = db.command
db.collection('goods').where({category: 'computer',type: {memory: dbCmd.and(dbCmd.gt(4), dbCmd.lt(32))}
})

or 或

表示需满足所有指定条件中的至少一个。如筛选出价格小于 4000 或在 6000-8000 之间的计算机:

const dbCmd = db.command
db.collection('goods').where({category: 'computer',type: {price: dbCmd.or(dbCmd.lt(4000), dbCmd.and(dbCmd.gt(6000), dbCmd.lt(8000)))}
})

如果要跨字段 “或” 操作:(如筛选出内存 8g 或 cpu 3.2 ghz 的计算机)

const dbCmd = db.command
db.collection('goods').where(dbCmd.or({type: {memory: dbCmd.gt(8)}},{type: {cpu: 3.2}}
))// 查询返回值
{"data":[{"type": {"brand": "A","name": "A-01","memory": 16,"cpu": 3.2},"category": "computer","quarter": "2020 Q2","price": 2500},{"type": {"brand": "X","name": "X-01","memory": 8,"cpu": 4.0},"category": "computer","quarter": "2020 Q3","price": 6500}]
}

正则则表达式查询

db.RegExp

根据正则表达式进行筛选

例如下面可以筛选出 version 字段开头是 "数字+s" 的记录,并且忽略大小写:

根据正则表达式进行筛选

例如下面可以筛选出 version 字段开头是 "数字+s" 的记录,并且忽略大小写:

// 可以直接使用正则表达式
db.collection('articles').where({version: /^\ds/i
})// 也可以使用new RegExp
db.collection('user').where({name: new RegExp('^\\ds', 'i')
})// 或者使用new db.RegExp,这种方式阿里云不支持
db.collection('articles').where({version: new db.RegExp({regex: '^\\ds',   // 正则表达式为 /^\ds/,转义后变成 '^\\ds'options: 'i'    // i表示忽略大小写})
}

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

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

相关文章

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访,使用运营商专线或是采用内网穿透方案,彼此之间究竟有何区别呢? 简单来说,MPLS专线和普通宽带类似是运营商提供的网络租…

ruoyi后台管理系统部署-2-安装mysql

centos7 mysql 安装 1. 手动安装 安装 首先查看系统是否安装了: rpm -qa|grep mariadb rpm -qa | grep mysql systemctl status mysqld find / -name mysql.cnf卸载自带的 mariadb: rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps去官网下载 mysql 安装包&…

【数据结构与算法】之数组系列-20240113

这里写目录标题 一、66. 加一二、121. 买卖股票的最佳时机三、136. 只出现一次的数字四、268. 丢失的数字五、350. 两个数组的交集 II 一、66. 加一 简单 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位&…

NVMe系统内存结构 - PRP与PRP List

NVMe系统内存结构 - PRP与PRP List 1 为什么需要PRP2 PRP3 PRP List4 PRP寻址算法4.1 仅PRP1指向数据4.2 PRP1指向数据,PRP2指向数据4.3 PRP1指向数据,PRP2指向PRP List 本文属于《 NVMe协议基础系列教程》之一,欢迎查看其它文章。 1 为什么…

【C++】“Hello World!“

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 ​ 2024.1.14 纪念一下自己编写的第一个C程序 #include<iostream>int main() {/*我的第一个C程序*/std::cout << "Hello world!:>" <<std::endl;ret…

【开发板资料】Arduino NANO 资料分享(引脚分布图、原理图、亮灯程序等)

给出部分参考资料以及来源 引脚分布 PINOUT 来源&#xff1a;Nano | Arduino Documentation https://docs.arduino.cc/hardware/nano PINOUT PINOUT 来源&#xff1a;https://www.tumblr.com/pighixxx/42591353009/arduino-nano-pinout https://www.tumblr.com/pighixxx/…

C++深入学习之STL:1、容器部分

标准模板库STL的组成 主要由六大基本组件组成&#xff1a;容器、迭代器、算法、适配器、函数对象(仿函数)以及空间配置器。 容器&#xff1a;就是用来存数据的&#xff0c;也称为数据结构。 本文要详述的是容器主要如下&#xff1a; 序列式容器&#xff1a;vector、list 关联…

如何使用手机公网远程访问本地群辉Video Station中视频文件【内网穿透】

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&am…

React 原理

函数式编程 纯函数 reducer 必须是一个纯函数&#xff0c;即没有副作用的函数&#xff0c;不修改输入值&#xff0c;相同的输入一定会有相同的输出不可变值 state 必须是不可变值&#xff0c;否则在 shouldComponentUpdate 中无法拿到更新前的值&#xff0c;无法做性能优化操作…

【GitHub项目推荐--国外大神复刻暗黑2】【转载】

《暗黑破坏神2》&#xff0c;由顶尖游戏公司暴雪研发&#xff0c;2000 年上市&#xff0c;其资料片 2001 年上市&#xff0c;2D 画面。相信这款游戏已经成为很多人的回忆了&#xff0c;不知道当时是不是也和我一样沉迷于收集套装呢&#xff1f; 这款游戏的剧情设计、画面感都令…

vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)

文章目录 ⭐前言&#x1f496;vue3系列相关文章 ⭐搭建vue3项目过程&#x1f496; 初始化项目&#x1f496; 添加antd和router依赖&#x1f496; vite配置项映射目录和代理&#x1f496; antd国际化&#x1f496; layout布局封装&#x1f496; vite读取modules目录文件作为路由…

网络爬虫丨基于scrapy+mysql爬取博客信息并保存到数据库中

文章目录 写在前面实验描述实验框架实验需求 实验内容1.安装依赖库2.创建Scrapy项目3.配置系统设置4.配置管道文件5.连接数据库6.分析要爬取的内容7.编写爬虫文件 运行结果写在后面 写在前面 本期内容&#xff1a;基于scrapymysql爬取博客信息并保存到数据库中 实验需求 ana…

第二十八周:文献阅读笔记(弱监督学习)+ pytorch学习

第二十八周&#xff1a;文献阅读笔记&#xff08;弱监督学习&#xff09; 摘要Abstract1. 弱监督学习1.1. 文献摘要1.2. 引言1.3. 不完全监督1.3.1. 主动学习与半监督学习1.3.2. 通过人工干预1.3.3. 无需人工干预 1.4. 不确切的监督1.5. 不准确的监督1.6. 弱监督学习的创新点 2…

【读书笔记】《重构_改善既有代码的设计》重构的方法论

重构的方法论 标题&#xff1a;【读书笔记】【读书笔记】《重构_改善既有代码的设计》重构的方法论 时间&#xff1a;2024.01.14 作者&#xff1a;耿鬼不会笑 重构是什么? 什么是重构&#xff1a; “重构”这个词既可以用作名词也可以用作动词。 重构&#xff08;名词&…

HandlerInterceptor拦截器 postHandle执行addHeader无效,postHandle执行setStatus无效的解决方案

问题描述 想在postHandle方法里执行addHeader方法来补充一些Header信息&#xff08;如分页信息&#xff09;&#xff0c;但是最后执行却未如期显示 拦截器源码 import com.zhangziwa.practisesvr.utils.response.ResponseContext; import jakarta.servlet.http.HttpServletR…

动态内存管理4大函数的进阶

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

用C语言实现哈希表HashMap

代码仓库地址 1. 功能说明 自定义初始容量和负载因子&#xff1b;当键值对的个数与容量比值超过负载因子时&#xff0c;自动扩容&#xff1b;借鉴Java8的HashMap部分扩容逻辑&#xff0c;定义了单独的桶结构体用于记录hash值&#xff0c;以及2倍扩容&#xff0c;减少了hash运算…

Python二级:二叉树问题求解

一、题源 在Python二级考试中前10道基础题是必考题&#xff0c;虽然没有什么卵用&#xff0c;但是你得分不达标&#xff0c;还不让你过&#xff0c;没有办法只好硬着头皮去刷题了。这10道题中有一个二叉树题比较难&#xff0c;现摘录如下&#xff0c;同时给出gpt-4的解答&…

ruoyi后台管理系统部署-3-安装redis

centos7安装redis 1. yum 安装 查看是否安装了redis yum installed list | grep redis ps -ef | grep redis安装epel 仓库&#xff08;仓库是软件包下载的&#xff0c;类似maven&#xff0c;nuget&#xff09; yum install epel-release搜索 redis 包 yum search redis安装…

逸学Docker【java工程师基础】1.认识docker并且安装

场景问题 在实际开发过程中我们有这样的场景问题 在开发阶段的环境配置到了其他人项目人员那里就不能运行了&#xff0c;尽管配置规格相同&#xff0c;但是在较多的不同的环境情况下还是可能会有错误。 开发&#xff1a;程序员&#xff1a;你那边可以运行了吗 测试&#xf…