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');
 
  // 添加 add
  let 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');
  // 读 get
  let 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==65814f6f652341901b75d140
	db.collection('user')
	.where("username=='zhangsan' || _id=='65814f6f652341901b75d140'").get()
//查询 username 等于zhangsan 并且_id==65814f6f652341901b75d140
	db.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.mfbz.cn/a/320216.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft Excel 直方图

Microsoft Excel 直方图 1. 数据示例2. 打开 EXCEL3. settings4. 单击直方图柱,右键“添加数据标签”References 1. 数据示例 2. 打开 EXCEL 数据 -> 数据分析 -> 直方图 3. settings 输入区域样本值、接受区域分类间距,输出选项选择“新工作表组…

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr,lr,#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址,所以我们需要人为进行修正一下sub LR,L…

【DC系列教程2--Timing and Area Constrains】

DC系列教程2--Timing and Area Constrains Lab Flow:依赖输入Design SpecificationLab Demo Goal: determin the unit of time in the target library; //设置时间精度Create a Design Compiler timing and area constrains file based on a provided schematic and specifacat…

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

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…

std::atomic<int>的原理

⚠️WARNING⚠️ 注意: 试验平台是CentOS7,x86_64,Intel Xeon CPU 不同平台原理大不相同! [mzhaiinclude]$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 1 On-line CPU(s) lis…

66.网游逆向分析与插件开发-角色数据的获取-角色类的数据分析与C++还原

内容来源于:易道云信息技术研究院VIP课 上一个内容:65.网游逆向分析与插件开发-角色数据的获取-项目需求与需求拆解-CSDN博客 ReClass.NET工具下载,它下方链接里的 逆向工具.zip 里的reclass目录下:注意它分x64、x32版本&#x…

HarmonyOS-LocalStorage:页面级UI状态存储

管理应用拥有的状态概述 上一个章节中介绍的装饰器仅能在页面内,即一个组件树上共享状态变量。如果开发者要实现应用级的,或者多个页面的状态数据共享,就需要用到应用级别的状态管理的概念。ArkTS根据不同特性,提供了多种应用状态…

EasyExcel简单实例

EasyExcel简单实例 准备工作场景一:读取 Student 表需求1:简单读取需求2:读取到异常信息时不中断需求3:读取所有的sheet工作表需求4:读取指定的sheet工作表需求5:从指定的行开始读取 场景二:写入…

YOLOv8 Ultralytics:使用Ultralytics框架进行MobileSAM图像分割

YOLOv8 Ultralytics:使用Ultralytics框架进行MobileSAM图像分割 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行MobileSAM图像分割参考文献 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标(Metrics) 2.2.2 日志(log) 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

SMART PLC绝对值定位往复运动控制(脉冲绝对定位+状态机编程)

三菱FX3GA系列绝对定位指令DDRVA实现往复运动控制详细内容介绍请参考下面文章链接: https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍SMART PLC里如何开启绝对值定位指…

隧道自动化监测系统的主要产品和监测内容

一、背景 随着交通行业的不断发展,隧道作为交通基础设施的重要组成部分,其安全和稳定性对于保障人们的生命财产安全具有重要意义。隧道自动化监测系统作为一种先进的安全监测手段,能够实时监测隧道内部的各项参数,为隧道的安全运…

CentOS 7.6的HTTP隧道代理如何支持移动设备和远程用户

在CentOS 7.6上配置HTTP隧道代理以支持移动设备和远程用户,需要考虑到移动网络的特点以及远程用户的需求。以下是一些关键步骤和策略,可以帮助你实现这一目标。 1. 优化移动设备体验 压缩数据:HTTP隧道代理可以用于压缩进出移动网络的数据&…

Fluent 动网格应用:2.5D 网格重构

1 概述 2.5D 网格重构是一种快速网格重构方法,主要应用于涡旋压缩机等存在复杂平面运动且无法简化为二维计算的问题。 涡旋压缩机工作原理(视频源:维基百科) 适用于 2.5D 动网格的问题特点: 计算域几何形状为柱体类形…

(菜鸟自学)搭建虚拟渗透实验室——安装Windows 7 靶机

安装Windows 7 靶机 新建一台虚拟机,并选择Windows 7系统 虚拟机基本配置如下 为虚拟机挂载Windows7的镜像 点击开启虚拟机,将进入安装程序,按如下步骤进行操作: 点击“下一步”》勾选“我接受许可条款”,点击“下…

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

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

八. 实战:CUDA-BEVFusion部署分析-导出带有spconv的SCN网络的onnx

目录 前言0. 简述1. 使用spconv进行SCN的推理测试2. 导出onnx3. 补充-装饰器钩子函数总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第八章——实战&#x…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望,其中典型的是每每到重大节日尤其是双十一或者双十二,消费市场异常火爆,这也使得快递行业加班加点的干也不追不上人们下单的速度。如今,互联网时代崛起,网购成为了大家最寻…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统(RDBMS) SQLSQL介绍SQL类型SQL 基础语言学习创建表(create table)语法 数据类型SQL最常用的数据类型 学习链接 基础篇:数据库 SQL 入门教程 数据库 用于存储数据 存放…