Bootstrap

微信小程序 - - 云开发の数据库学习笔记

一、学习前的准备和了解

需要安装微信小程序开发工具,在主机上配置Node.js环境,数据库的开发指引

类型解释
数据库云开发函数可用当前环境对应的数据库(也可根据需要用不同数据库)(对应MYSQL的数据库)(取值Object.xxx)
集合数据库中多个记录的集合(对应MYSQL的表)(取值array[0])
文档数据库中的一条记录(对应MYSQL的行row)(取值Object.xxx)
字段数据库中特定记录的值(对应MYSQL的行col)(取值string/int/float)
命令特定的数据库查询命令,大于、小于、等于

二、增删改查

注意:在进行增删改操作时,不能够操作在控制台新增的记录(因为只有读的权限,没有写的权限)

在这里插入图片描述

2.1.创建集合并获取引用
// 创建一个名为demoList的集合

在这里插入图片描述

// 在全局初始化数据库,全局(Page或Component外面)
const db = wx.cloud.database()
// 在相应函数中获取集合引用,局部(某个函数中)
const todos = db.collection('demoList')
//使用Promise链式调用,解决回调地狱的问题,then其实就是进行回调
db.collection("demoList").get().then(res=>{
}).then(res=>{    //执行成功时调用
}).catch(err=>{   //执行失败时调用
})      
2.2.增加
2.2.1.增加一条记录 - - get
addData(){
  //为了防止用户多次操作,点击按钮一次获取后就不能再次操作了
  wx.showLoading({
    title: '数据加载中...',
    mask:true   //必选项
  })
  //往云数据库插入时间(Date)类型数据处理
  let date="2021-2-4 11:30";
  let transdate=new Date(Date.parse(date.replace(/-/g,  "/")));
  db.collection("demoList").add({
    data:{
      name:'华华',
      age:22,
      school:'蓝翔技术学院',
      graduatetime:transdate,
      majorcourse:["厨师","洗剪吹","挖掘机"]
    },
  }).then(res=>{  //添加成功时返回的是id值
    console.log("add",res)
    wx.hideLoading()  //添加数据完成之后取消数据加载...
  })
},
2.3.删除
2.3.1.根据id删除一条记录 - - delete
deleteData(e){
  db.collection("demoList").doc("859059a56195f6430691a50a747df246").remove()  //根据id删除一条数据
  .then(res=>{
    console.log(res)   //修改成功时返回的是updated: 1,修改状态
  })
},

注意:在小程序中没有权限删除多条记录,只能通过id,可以通过云函数实现

2.4.修改
2.4.1.根据id修改记录中的字段 - - update
updateData(e){
  // update方法:局部更新一个或多个记录
  db.collection("demoList").doc("859059a56195f6430691a50a747df246").update({    //根据id修改数据
    data:{
      name:'蔡徐坤'
    }
  }).then(res=>{
    console.log(res)   //修改成功时返回的是updated: 1,修改状态
  })
},

注意:在小程序中没有权限使用where条件查询修改记录,只能通过id,可以通过云函数实现
在这里插入图片描述

2.4.2.根据id修改记录中的字段 - - set
updateData(e){
  // set方法:替换更新一个记录,将原字段都删除,只留下修改后的字段和id
  db.collection("demoList").doc("859059a56195f6430691a50a747df246").set({    //根据id修改数据   
    data:{
	  name:'蔡徐坤'
	}
  }).then(res=>{
    console.log(res)   //修改成功时返回的是updated: 1,修改状态
  })
},
2.5.查询
2.5.1.查询所有记录 - - get
getData(){
  db.collection("demoList").get().then(res=>{
    this.setData({
      dataList:res.data,
    })
  })
}
2.5.2.根据id查询记录 - - doc.get
// 只有一条数据会将其存放到对象中
db.collection("demoList").doc("9e7190f16194a447064a59d7494022ee").get().then(res=>{
  this.setData({
    dataList:res.data,
  })
})
2.5.3.条件查询 - - where.get
// 条件查询,根据name="咔咔"来查询记录
db.collection("demoList").where({
  name:"咔咔"
}).get().then(res=>{    //查询成功返回符合条件的记录,就算只有一条记录也会将其存放到一个数组中,如果有多条符合条件的会将所有记录都查询出来
  console.log(res.data)
  this.setData({
    dataList:res.data,
  })
})
2.5.4.分页查询 - - limit.get
// 小程序默认最大查询上限20个,云函数1000个
// 每一页查询2条数据
db.collection("demoList").limit(2).get().then(res=>{
  console.log(res)
})
2.5.5.排序查询 - - orderBy.get
// 两个参数,orderBy("要排序的字段","顺序"),正序asc(默认)/倒序desc
// 单字段排序
db.collection("demoList").orderBy("chengji","desc").get().then(res=>{
 console.log(res)
})
// 多字段排序
db.collection("demoList").orderBy("chengji","desc").orderBy("graduatetime","asc").get().then(res=>{
  console.log(res)
})
2.5.6.过滤查询 - - skip.get
// 过滤掉前2个记录,从第3个记录开始查询出剩下所有记录
db.collection("demoList").skip(2).get().then(res=>{
 console.log(res)
})
// 每一页查询两条数据,过滤掉前3条数据(这样有4条数据,就只能查出1条数据)
db.collection("demoList").limit(2).skip(3).get().then(res=>{
  console.log(res)
})
2.5.7.查询指定字段 - - field.get
// 查询出的记录中只有id和name字段
db.collection("demoList").field({
  name:true
}).get().then(res=>{
  console.log(res)
})
2.6.其他
2.6.1.获取记录条数 - - count
getCount(){
  db.collection("demoList").count().then(res=>{
    console.log(res.total)
  })
},
2.6.2.监听记录操作 - - watch
getOneData(){
  db.collection("demoList").doc("9e7190f16194a50d064a737f7b7963f6").get().then(res=>{
    this.setData({
      demoList:res.data,
    })
  })
},
onLoad: function (options) {   //生命周期函数--监听页面加载
  this.getOneData()  //页面加载时将数据获取到,进而渲染到页面中
  //对每次操作(增删改)都会进行监听
  db.collection("demoList").watch({
    onChange:res=>{
      this.setData({
        demoList:res.docs      //每次修改后,将数据进行覆盖
      })
      console.log("res",res)   //监听成功打印docChanges中是demoList中被操作的记录,docs中是获取的demoList最新的数据
    },
    onError:err=>{
      console.log("err",err)  
    }
  })
},
2.7.command命令
2.7.1.准备

command文档

// 要使用command就必须在全局定义一个下划线_(当然也可以定义成其他的变量)
const _=db.command;
// 使用,用下划线先取到command对象,然后再对其进行操作
_.eq("张三")
2.7.2.查询 - - 比较操作符
命令解析
eq等于
neq不等于
lt小于
lte小于等于
gt大于
gte大于等于
in在集合中
nin不中集合中
// 查询name="张三"的记录
db.collection("demoList").where({
  name:_.eq("张三")
}).get().then(res=>{
  console.log(res)
})
// 查询name在["张三","杨洋"]集合中的记录
db.collection("demoList").where({
  name:_.in(["张三","杨洋"])    //age:_.in([0,100])  查询age=0或age=100的记录
 }).get().then(res=>{
   console.log(res)
})
2.7.3.查询 - - 字段操作符
命令解析
exists存在改字段,true为存在,false为不存在
mod取余
// 找出存在age字段的记录
db.collection("demoList").where({
  age:_.exists(true)
}).get().then(res=>{
  console.log(res)
})
// 取余,找出age%10=1的记录
db.collection("demoList").where({
  age: _.mod(10, 1)   //如果找10的倍数,age: _.mod(10, 0),即age%10=0
}).get().then(res=>{
  console.log(res)
})
2.7.4.查询 - - 逻辑操作符
命令解析
and
or
not
nor都不
// and,并列取值,取出 age>18 & age<28 的记录
db.collection("demoList").where({
  age: _.and([_.gt(18),_.lt(28)])   
}).get().then(res=>{
  console.log(res)
})
// and,并列条件,查询 name="三十" and age=10 的记录
db.collection('demoList').where(_.and([  
  {name: _.eq("三十")},
  {age: _.eq(10)}
])).get().then(res=>{
  console.log(res)
})
// or,取出 age<18 || age>28 的记录
db.collection("demoList").where({
  age: _.or([_.lt(18),_.gt(28)])   
}).get().then(res=>{
  console.log(res)
})
// not,取出 !age<28 的记录(即age>28)
db.collection("demoList").where({
  age: _.not([_.lt(28)])   
}).get().then(res=>{
  console.log(res)
})
2.7.5.查询 - - 数组操作符
命令解析
all数组中包含给定值
elemMatch数组中包含至少一个满足 elemMatch 给定的所有条件的元素
size数组字段长度为 给定值 的所有记录
// all,取出数组majorcourse包含钢琴和瑜伽的(钢琴和瑜伽是并列关系)
db.collection("demoList").where({
  majorcourse: _.all(["钢琴","瑜伽"])   
}).get().then(res=>{
  console.log(res)
})
// size,取出数组majorcourse有3项的记录
db.collection("demoList").where({
  majorcourse: _.size(3)   
}).get().then(res=>{
  console.log(res)
})
2.7.6.更新 - - 字段操作符
命令解析
set更新字段及值(会将原属性都覆盖掉)
remove删除某个字段
inc自增长(可正可负,可以用于点赞后点赞数自增长)
mul字段自乘某个值
min给定一个值,只有该值小于字段当前值才进行更新
max给定一个值,只有该值大于字段当前值才进行更新
rename字段重命名
// set,仅仅操作的是style这个字段
db.collection("demoList").doc("859059a561963c8e069edeb42c67467d").update({
  data:{
  	// style:{         //将style字段的color属性及值进行更新(不会将原属性都覆盖掉),最后style属性color:"yellow",weight:"20px"
    //   color:"yellow",   
    // }
    style:_.set({   //将style字段及值进行更新(会将原属性都覆盖掉),最后style属性只有color:"yellow"
      color:"yellow",   
    })
  }
})
// inc,点赞数自增长,每次自增1,要求增长的字段必须为number类型
// mul,累乘
thumbUp(e){
  db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
    data:{
      // thumbup:_.inc(1)  //_.inc(10),每次自增10    // _.inc(-10),每次自减10
      thumbup:_.mul(10)   
    }
  })
},
// remove,删除age字段
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{    
  	age:_.remove()
  }
})
2.7.7.查询 - - 数组操作符
命令解析
push在数组末尾追加元素,如果没有这个数组则新建一个再追加进去,或者在指定位置上追加
pop删除数组末尾一个元素
unshift在数组开头添加元素,如果没有这个数组则新建一个再添加进去
shift删除数组开头一个元素
pull删除数组中指定值的一个元素
pullAll
addToSet
// push,在majorcourse后面追加金融,新建一个activity数组,追加玩游戏,看电视,写作业
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
    majorcourse:_.push(["金融"]),
    activity:_.push(["玩游戏","看电视","写作业"])
  }
})
// push,在activity数组的第1个位置追加买衣服,吃饭
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
    activity:_.push({
	  each:["买衣服","吃饭"],
	  position:1   //添加到第1个位置,从0开始
	})
  }
})
// pop,删除activity数组末尾的一个元素
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
     activity:_.pop()
  }
})
// unshift,在activity前面追加写作业,睡觉
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
     activity:_.unshift(["写作业","睡觉"])
  }
})
// shift,删除activity数组开头的一个元素
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
     activity:_.shift()
  }
})
// pull("值"),删除activity数组中指定值的一个元素
db.collection("demoList").doc("9e7190f161963c6c068a8ae77e3ae04d").update({
  data:{
     activity:_.pull("看电视")
  }
})

三、小案例

3.1.提交表单添加到云数据库
<!-- index.wxml -->
<form bindsubmit="btnSub">
  <input name="name" placeholder="请输入姓名"></input>
  <input name="age" placeholder="请输入年龄"></input>
  <input name="school" placeholder="请输入毕业学校"></input>
  <input name="graduatetime" placeholder="请输入毕业时间,格式2021-12-21"></input>
  <input name="majorcourse1" placeholder="请输入主修课程1"></input>
  <input name="majorcourse2" placeholder="请输入主修课程2"></input>
  <input name="majorcourse3" placeholder="请输入主修课程3"></input>
  <button type="primary" form-type="submit">提交</button>
  <button type="primary" form-type="reset">重置</button>
</form>
<!-- bindinput="getInputValue",输入的内容可以被获取到 -->
<input bindinput="getInputValue" placeholder="请输入id值"></input>
btnSub(e){
  wx.showLoading({
    title: '数据加载中...',
    mask:true   
  })
  // 原始的获取表单中的内容方法
  // var name=e.detail.value.name;
  // 现在的获取表单中的内容方法,res.detail.value是个对象
  var {name,age,school,graduatetime,majorcourse1,majorcourse2,majorcourse3}=e.detail.value
  // 由于获取的内容都是string类型的,需要将其转化为对应的格式
  let ageint=parseInt(age)
  let graduatetimedate=new Date(Date.parse(graduatetime.replace(/-/g,  "/")));
  let majorcourse=[majorcourse1,majorcourse2,majorcourse3]
  db.collection("demoList").add({
    data:{
      name:name,
      age:ageint,
      school:school,
      graduatetime:graduatetimedate,
      majorcourse:majorcourse
    }
  }).then(res=>{
    wx.hideLoading()
  })
},
getInputValue(e){
  var getid=e.detail.value;
  this.setData({
    id:getid
  })
},

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;