最近一直在折腾微信小程序,刚开始是用的python tornado 加上MongoDB自己搭建的后台,做完了一个之后。打算纯粹的使用微信小程序云开发来做一个。这篇文章就是云数据库使用的一些总结。
刚开始看到这个云数据库的时候,第一感觉就是,这不就是MongoDB吗。
这就简单了,毕竟MongoDB我自己瞎玩的时候用的挺多的,撸起袖子就是干。
1. 创建集合
首先开通微信小程序的云开发环境,然后打开云开发控制台,添加集合。因为我做的是记账的微信小程序,所以创建了一个userbills 集合。
2. 记录数据
/* mydata ={
money: 88,
date: '2018-12-28',
first_level: '账单的父类别',
child_level: '账单的子类别',
info: '账单的备注信息'
} */
const db = wx.cloud.database();
const collections = db.collection('userbills');
collections.add({
data: {
data: mydata,
time: util.formatTime(new Date())
},
success(result) {
app.globalData.myid = result._id,
app.globalData.mydata = mydata,
console.log('add')
that.postbillsuccess()
}
})
添加之后数据库里的结构是这样的:(_id, _openid字段是默认插入的,openid就是用户的认证信息)
3. 查询
查询推荐在云函数里查询,因为前端写的查询,一次最多只能返回20条数据(当然结合分页来使用还是挺好的)。而在云函数查询数据库,一次最多可以返回100条数据,数据量大的时候可以节省数据库读的次数。
const db = cloud.database()
const MAX_LIMIT = 100
const collections = db.collection('usersbill')
const _ = db.command
const wxContext = cloud.getWXContext()
var firstdate = event.firstdate; // 前端调用云函数时传入的时间参数,用来取对应区间里的账单数据
var lastdate = event.lastdate;
const countResult = await collections.where({
_openid: wxContext.OPENID, // 这里需要注意,写数据的时候,会自动为我们添加用户的openid,可是读取的时候,需要自己把这个限制条件加上去。
data: {
date: _.and(_.gte(firstdate), _.lte(lastdate))
}
}).count() // 获取该区间段所有的账单总数
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / 100)
// 承载所有读操作的 promise 的数组
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = collections.where({
_openid: wxContext.OPENID,
data: {
date: _.and(_.gte(firstdate), _.lte(lastdate))
}
}).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => ({
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}))
涉及到数据库和查询,当然要创建索引来增加查询的速度,这个查询一共是根据两个字段的,'_openid' 和 'data.date' 两个字段,所以,我们在索引处添加这两个字段。
4. 更新字段
更新字段,
// myid 是所要更新的数据的 _id
collections.doc(myid).update({
data:{
data: mydata // 更新的字段以及数值
},
success:res=>{
console.log(res)
},fail: err=>{
console.log(err)
}
})
5. 删除数据
删除数据
collections.doc(id).remove({
success: function (res) {
console.log(res)
wx.showToast({
title: '删除成功',
icon: 'success',
duration: 2000
})
}
})