Bootstrap

微信小程序·云开发 云数据库的基本使用

最近一直在折腾微信小程序,刚开始是用的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
        })
      }
    })

 

我的一个成品微信小程序:

Random电影日历,每天一部电影,还能看天气。

 

;