前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云数据库基础

云数据库基础

作者头像
大帅老猿
发布2022-04-13 19:53:56
1.8K0
发布2022-04-13 19:53:56
举报
文章被收录于专栏:大帅老猿大帅老猿

前言

本节中的内容来自对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();

小结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大帅老猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • uniCloud云数据库介绍
    • 注意事项
    • 字段的基础数据类型
    • 数据库索引
    • 云函数内操作云数据库
      • 获取云数据库对象
        • 获取一个集合对象
          • 新增记录add
            • 统计数量count
              • 获取记录get
                • 获取指定_id对应的记录doc
                  • 查询筛选记录where
                    • 查询筛选指令
                      • 跳过指定数量的记录skip
                        • 数据的排序方式orderBy
                          • 返回记录条数上限limit
                            • 指定返回数据的字段field
                              • 更新记录update
                                • 批量更新记录
                                • 更新指令update
                              • 覆盖记录set
                                • 删除记录remove
                                • 小结
                                相关产品与服务
                                数据库
                                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档