云数据库基础

2022-04-13 19:53:56 浏览数 (1)

前言

本节中的内容来自对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)”。nametel称之为“字段(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集合不存在,会自动创建。

代码语言:javascript复制
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 还可以使用正则表达式来查询文档,比如

代码语言:javascript复制
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();

小结

这可能是很多前端刚入门小伙伴们第一次接触到操作数据库,知识点有点多。不过,不用特别在意,本文就当做在脑海里植入一个印象,我们会在稍后的实战中真正的熟悉它们,并且在后面的实战训练中越来越熟练掌握它们。

0 人点赞