前言
本节中的内容来自对uniCloud官方文档的重新梳理,为了让本课程的学习曲线更加平缓,仅保留我认为对本课程有用的部分。
uniCloud云数据库介绍
uniCloud
是nosql非关系型数据库,提供了一个JSON格式的文档型数据库。数据库中每条记录都是一个JSON格式的文档。如果你之前熟悉sql关系型数据库,那么两者部分概念的对应关系如下
关系型 | JSON 文档型 |
---|---|
数据库 database | 数据库 database |
表 table | 集合 collection。但行业里也经常称之为“表”。无需特意区分 |
行 row | 记录 doc |
字段 column | 字段 field |
使用sql语法操作 | 使用MongoDB语法或jql操作 |
一个uniCloud
服务空间,有且只有一个数据库。一个数据库可以有多个集合。一个集合可以有多条记录。每条记录可以有多个字段。
举例说明,数据库中有一个集合名为users,用于存放用户信息。该集合的数据内容如下
代码语言:javascript复制{"_id":"622579524331570001ec2fbe","name":"张三","tel":"13900000000"}
{"_id":"62257f511e3fed0001485e9b","name":"李四"}
上述数据中,每行数据表示一个用户的信息,被称之为“记录(doc)”。name
和tel
称之为“字段(field)”。而“13900000000”则是第一条记录的字段tel
的值。_id
是该条数据由系统自动生成的id。
和关系型数据库相比,JSON文档数据库非常灵活,用户李四的数据可以没有
tel
字段
注意事项
- 对于初学者而言,设计一个数据集合到底应该有哪些字段,可以参考https://gitee.com/dcloud/opendb,这里给大家罗列了大部分常见的数据库设计模板。
- uniCloud云数据库基础服务阿里云和腾讯云提供,它们的数据库大体相同,但有细微差异。比如阿里云的数据库是mongoDB4.0,腾讯云则使用自研的文档型数据库(兼容mongoDB 4.0版本)。在本课程中,将只会使用阿里云。
- 如果想在云函数连接其他数据库,如mysql,用法和nodejs连接这些数据库是一样的。
字段的基础数据类型
记录内的字段基础数据类型有以下几种:
- String:字符串
- Number:数字
- Object:对象
- Array:数组
- Bool:布尔值
- GeoPoint:地理位置点
- GeoLineStringLine: 地理路径
- GeoPolygon: 地理多边形
- GeoMultiPoint: 多个地理位置点
- GeoMultiLineString: 多个地理路径
- GeoMultiPolygon: 多个地理多边形
- Date:时间
- Null:相当于一个占位符,表示一个字段存在但是值为空
大部分数据类型有JS基础的同学一看就明白,个别少见的我们会在后面的实战中用上就能学会,这里不再赘述。
数据库索引
所谓索引,是指在数据表的众多字段中挑选一个或多个字段,让数据库引擎优先处理这些字段。设置为索引的字段,在通过该字段查询记录时可以获得更快的查询速度。但设置过多索引也不合适,会造成数据新增和删除变慢。
- 一个数据表可以有多个字段被设为索引。
- 索引分唯一型和非唯一型。
唯一型索引要求整个数据表多个记录的该字段的值不能重复。比如
_id
就是唯一型索引。
举例说明:假使数据集合中有2条记录的name字段值都是“张三”,那么他们在user数据表里的区分就是依靠不同的_id
来区分。如果我们要根据name字段来查询,为了提升查询速度,就可以把name字段设为非唯一索引。
在web控制台添加上述索引
注意
- 如果记录中已经存在多个记录某字段相同的情况,那么将该字段设为唯一型索引会失败。
- 如果已经设置某字段为唯一索引,在新增和修改记录时如果该字段的值之前在其他记录已存在,会失败。
云函数内操作云数据库
uniCloud云数据库既支持通过云函数操作,也支持在前端来操作,但前端操作时会收到一部分限制,后面会有专门写一篇前端操作数据库的教程,本文仅向大家介绍云函数中操作云数据库的方法。
获取云数据库对象
代码语言:javascript复制const db = uniCloud.database();
获取一个集合对象
代码语言:javascript复制const db = uniCloud.database();
db.collection("users");
在这个数据集合对象上我们可以进行以下操作
新增记录add
调用集合对象的add
方法,给某数据表新增数据记录时,如果该数据表不存在,会自动创建该数据表。如下代码给users集合新增了一条数据,如果users集合不存在,会自动创建。
const db = uniCloud.database();
db.collection("users").add({name: 'Ben'})
统计数量count
代码语言:javascript复制const db = uniCloud.database();
db.collection("users").count();
/*count返回的数据结构
{
affectedDocs,//受影响的项目数量
total//统计到的总数
}
*/
获取记录get
代码语言:javascript复制const db = uniCloud.database();
db.collection("users").get();
/*get返回的数据结构
{
affectedDocs,//受影响的项目数量
data//获取到的记录的数组
}
*/
获取指定_id
对应的记录doc
代码语言:javascript复制const db = uniCloud.database();
db.collection("users").doc('622579524331570001ec2fbe').get();
/*get返回的数据结构
{
affectedDocs:1,//受影响的项目数量
data//获取到的记录的数组
}
*/
查询筛选记录where
通过指定条件查询筛选出匹配的记录,可搭配查询筛选指令使用
代码语言:javascript复制const db = uniCloud.database();
//查询users集合内所有name字段等于张三的记录
db.collection("users").where({
name:"张三"
}).get();
where
还可以使用正则表达式来查询文档,比如
db.collection('user').where({
name: new RegExp('^ABC')//查询所有name字段以ABC开头的用户
})
查询筛选指令
以下指令挂载在 db.command
下
类型 | 接口 | 说明 |
---|---|---|
比较运算 | eq | 字段等于 == |
neq | 字段不等于 != | |
gt | 字段大于 > | |
gte | 字段大于等于 >= | |
lt | 字段小于 < | |
lte | 字段小于等于 <= | |
in | 字段值在数组里 | |
nin | 字段值不在数组里 | |
逻辑运算 | and | 表示需同时满足指定的所有条件 |
or | 表示需同时满足指定条件中的至少一个 |
跳过指定数量的记录skip
代码语言:javascript复制const db = uniCloud.database();
//获取users集合内的从第5条起的所有数据
db.collection("users").skip(4).get();
数据的排序方式orderBy
代码语言:javascript复制const db = uniCloud.database();
//获取users集合内的所有数据,返回的数据按照createtime字段的值由大到小排列
db.collection("users").orderBy("createtime","desc").get();
如果需要对嵌套字段排序,可以用 "点表示法" 连接嵌套字段,比如 style.color 表示字段 style 里的嵌套字段 color。同时也支持按多个字段排序,可多次调用 orderBy ,多字段排序时的顺序会按照 orderBy 调用顺序先后对多个字段排序。
返回记录条数上限limit
代码语言:javascript复制const db = uniCloud.database();
//获取users集合内的10条数据
db.collection("users").limit(10).get();
指定返回数据的字段field
代码语言:javascript复制const db = uniCloud.database();
//获取users集合内的数据,返回数据只包含name字段
db.collection("users").field({
name:true //
}).get();
注意
- field内指定是否返回某字段时,不可混用true/false。即{'a': true, 'b': false}是一种错误的参数格式
- 只有使用{ '_id': false }明确指定不要返回_id时才会不返回_id字段,否则_id字段一定会返回。
更新记录update
使用更新记录函数时可配合更新指令使用。局部更新记录只更新传入的字段。如果被更新的记录不存在,会直接返回更新失败。
代码语言:javascript复制const db = uniCloud.database();
//原记录
/*
{
_id:"622579524331570001ec2fbe",
name:"李四"
}
*/
db.collection("users").doc('622579524331570001ec2fbe')
.update({
"name":"李小四"
});
//更新后
/*
{
_id:"622579524331570001ec2fbe",
name:"李小四"
}
*/
批量更新记录
配合where使用
代码语言:javascript复制//更新user集合中所有name字段为李四的记录,将字段值李四改为李小四
db.collection("users").where({
"name":"李四"
})
.update({
"name":"李小四"
});
更新指令update
以下指令挂载在 db.command
下
类型 | 接口 | 说明 |
---|---|---|
字段 | set | 设置字段值 |
remove | 删除字段 | |
inc | 加一个数值,原子自增 | |
mul | 乘一个数值,原子自乘 | |
push | 数组类型字段追加尾元素,支持数组 | |
pop | 数组类型字段删除尾元素,支持数组 | |
shift | 数组类型字段删除头元素,支持数组 | |
unshift | 数组类型字段追加头元素,支持数组 |
覆盖记录set
set会删除操作的记录中的所有字段,创建传入的字段。如果操作的记录不存在,会自动创建新的记录。
代码语言:javascript复制const db = uniCloud.database();
//原记录
/*
{
_id:"622579524331570001ec2fbe",
name:"李四"
}
*/
db.collection("users").doc('622579524331570001ec2fbe')
.set({
"gender":"男"
});
//更新后
/*
{
_id:"622579524331570001ec2fbe",
gender:"男"
}
*/
删除记录remove
代码语言:javascript复制const db = uniCloud.database();
db.collection("users").doc('622579524331570001ec2fbe').remove();
小结
这可能是很多前端刚入门小伙伴们第一次接触到操作数据库,知识点有点多。不过,不用特别在意,本文就当做在脑海里植入一个印象,我们会在稍后的实战中真正的熟悉它们,并且在后面的实战训练中越来越熟练掌握它们。