数据库
云开发提供的三个基本功能:
1. 数据库
2. 云函数
3. 存储
本章,着重讲解云开发的数据操作。
云开发提供的是一个json数据库,该数据库可以拥有多个集合,每个集合相当于一个json数组
每个json数组是由多个json对象组成。
例如:
一个存放图书信息的 bookes 集合
[
{
"_id":"book_1",
"_openid":"cVdkjaskjdfVdfjask678",
"author":"Joh",
characters: [
'Holden Caulfield',
'Stradlater',
'Mr. Antolini'
],
publishInfo: {
year: 1951,
country: 'United States'
}
},
{
"_id":"book_2",
"_openid":"cVdkjas34kjdfVdfjask678",
"author":"Joh",
characters: [
'Holden Caulfield',
'Stradlater',
'Mr. Antolini'
],
publishInfo: {
year: 1951,
country: 'United States'
}
},
{
"_id":"book_3",
"_openid":"cVdkjaskjdf443Vdfjask678",
"author":"Joh",
characters: [
'Holden Caulfield',
'Stradlater',
'Mr. Antolini'
],
publishInfo: {
year: 1951,
country: 'United States'
}
}
]
在其中我们可以看到,字段既可以是字符串或数字,还可以是对象或数组,就是一个JSON对象。
如何操作数据库
数据库 API 分为小程序端和服务端两部分,小程序端API拥有严格的调用权限控制,开发者可
在小程序内直接调用API进行非敏感数据的操作。对于有更高安全要求的数据,可在云函数内通
过服务端 API 进行操作。云函数的环境是与客户端完全隔离的,在云函数上可以私密且安全的
操作数据库。
数据库 API 包含增删改查的能力,使用API操作数据库只需三步:
1. 获取数据库引用
2. 构造查询/更新条件
3. 发出请求。
以上面列举的 bookes 集合为例子:
/*
* 获取数据库 : database 可填参数 @type string
*
* 无参数时默认环境数据库,可选测试环境 wx.cloud.database('test')
*/
const db = wx.cloud.database();
// 查询未例子 + 请求
db.collection("bookes").where({
publishInfo: {
country: 'United States'
}
}).get({
success(res) {
console.log("搜索结果:",res)
}
})
搜索 “bookes” 数据集合 条件:publishInfo[country] = "Unites States"
get() 发出请求 搜索成功返回结果在success函数中 参数res 即为结果
数据库的增删改查
我们假设一存在个数据库 bookes , 并存在一个数据集合 author
let db = wx.cloud.database();
let authorCollection = db.collection("author");
/*
* ps:获取某一个数据的引用(注意:这里不是简单存储的json数据)
*
* authorCollection.doc("it is json id")
*/
# 1 : 往数据库中增加数据
authorCollection.add({
data:{ // 数据集合存的是object ,这里直接写要存的object即可
},
success:function(result){
// 存取成功则返回增加的那条数据的_id
let _id = result._id;
},
fail:function(e){
console.error("添加数据失败:",e)
},
complete:function(){
console.log("有一次添加数据的动作")
}
})
# 2 :删
在小程序端删除单条数据
let jsonObject_1 = authorCollection.doc("first_author_id");
jsonObject_1.remove({
success:function(res){
console.log("删除成功:",res)
// res = {stats:{ removed: 0 / 1 }} removed 为删除的条数
},
fail:function(e){
console.error("删除失败:",e);
}
})
如果想批量删除数据,则必须在云函数中操作,用where 查询遇见搜索到符合条件的再删除
authorCollection.where({
key:value // 搜索json对象的某个key的值
}).remove({
success:function(res){
}
})
# 3 . 改
更新数据主要涉及两个api
1. update
2. set
update 可认为是更新记录的局部字段,而 set 则是将某个记录直接全部更改
3.1 update 可以局部更新一个 / 多个 记录(json数据)
let needUpdate_1 = authorCollection.doc("need_update_id_1");
needUpdate_1.update({
key:value, // 将该条数据的 key 指定设置为某个值,
success:function(res){
console.log("更新成功:",res);
},
faile:function(e){
console.error("更新失败:",e);
},
complete:function(){
console.log("进行过一次更新数据的操作");
}
})
除了指定更新某个key的值外,微信还提供了一系列的api方便直接操作key或key的值
更新指令 说明
set 设置字段为指定值
remove 删除字段
inc 原子自增字段值
mul 原子自乘字段值
push 如字段值为数组,往数组尾部增加指定值
pop 如字段值为数组,从数组尾部删除一个元素
shift 如字段值为数组,从数组头部删除一个元素
unshift 如字段值为数组,往数组头部增加指定值
要使用这些命令,首先要获取更新指令对象
const _ = db.command;
1. set
上面的例子直接更新了值,那么set 的作用就是将值更新为对象
needUpdate_1.update({
data:{
style:_.set({
color:"bule"
})
}
})
2. remove
删除某一个字段
needUpdate_1.update({
data:{
style:_.remove() // 删除这条数据中的style字段
}
})
3. inc
微信原描述:直接对原子进行自增操作
(虽然官方没有明确表示要用做数字,建议对number类型的值用这个方法)
例子1: 将某个字段的值增加 10
needUpdate_1.update({
data:{
moeny:_.inc(10)
}
})
4. mul 自乘
needUpdate_1.update({
data:{
moeny:_.mul(10000)
}
})
5. 如果是想操作数组的话 push pop shift unshift
使用效果和js对应名称的数组操作方法一致
needUpdate_1.update({
data:{
bookes:_.push("new_book_1")
}
})
……
3.2 set
set 用于直接替换某一个记录
needUpdate_1.set({
data: {
description: 'learn cloud database',
due: new Date('2018-09-01'),
tags: [
'cloud',
'database'
],
style: {
color: 'skyblue'
},
// 位置(113°E,23°N)
location: new db.Geo.Point(113, 23),
done: false
},
success(res) {
console.log("替换成功:",res);
},
fail:function(e){
console.error("替换失败:",e)
},
compelet:function(){
console.log("进行一次数据替换操作")
}
})
4. 查
where 则是微信官方提供给开发者用于筛选数据的api
get() 方法基本会配合使用,用来获取搜索到的数据
我们即可以指定筛选某个字段的值
authorCollection.where({
sorce:10,
}).get({
success:function(res){
console.log("成功查询到数据:",res)
},
faile:function(e){
console.error("查询数据失败:",e)
},
complete:function(){
console.log("有过一次查询数据的操作")
}
})
我们也可以依靠提供的指令筛选范围值
当然这些指令依然在 db.command 中
const _ = db.command;
查询指令 说明
eq 等于
neq 不等于
lt 小于
lte 小于或等于
gt 大于
gte 大于或等于
in 字段值在给定数组中
nin 字段值不在给定数组中
例子1: 筛选分数等于10的记录
authorCollection.where({
sorce:_.eq(100)
})
这些指令能解决很多东西,但远不够,微信还提供了逻辑指令,可用于我们筛选范围内的值
and or
authorCollection.where({
sorce:_.gte(100).and(_.lte(1000)) // 搜索大于等于100 且 小于等于1000
})
authorCollection.where({
sorce:_.gte(1000).or(_.lte(100)) // 搜索大于等于1000 或 小于等于100
})
or 的命令还可以实现多条件查询
authorCollection.where(_.or([
{
sorce:_.eq(100)
},
{
name:"name_1"
}
])).get({
success:function(res){
console.log("成功查询到数据:",res)
},
faile:function(e){
console.error("查询数据失败:",e)
},
complete:function(){
console.log("有过一次查询数据的操作")
}
})
promise 方式 (主要为了熟悉重新写一遍)
上述的增删改查都可以以promise回调的形式获取到结果
let db = wx.cloud.database();
const _ = db.command;
let authorCollection = db.collection("author");
// add
authorCollection.add({
data:{
}
}).then(res => {
console.log("增加数据成功:",res);
}).catch(e => {
console.error("增加数据失败:",e);
})
// remove
1. 删除单条
authorCollection.doc("remove_id").remove().then(res => {
})
.cathc(e => {
})
2. 删除多条需要在云环境下运行(云函数内操作)
authorCollection.where({
sorce:_.gt(5)
}).remove().then(res => {
}).catch(e => {
})
// 更新 / 更改
// update
let doObject_1 = authorCollection.doc("do_id_1");
doObject_1.update({
data:{
style:_.set({
color:""red""
})
}
}).then(res => {
}).catch(e => {
})
doObject_1.update({
data:{
sorce:100
}
}).then(res => {
}).catch(e => {
})
// set
doObject_1.set({
data:{
style:{
color:"red",
font:5
},
sorce:123
}
}).then(res => {
}).catch(e => {
})
// 查
authorCollection.where({
sorce:_.gte(100).and(_.lte(1000))
}).get().then(res => {
}).catch(e => {
})