码code | 巧用2种方法,打破20条云开发数据库限制
小程序·云开发是小程序的一种后端开发模式,能够帮助开发者快速构建微信小程序的后端服务,无需再搭建服务器。
然而熟悉云开发的开发者应该了解,即使云开发能基本满足小程序开发需求,但在数据获取上还是有所限制。
为了防止误操作以及保护小程序体验,开发者是需要避免一次性获取过量的数据,只获取必要的数据,所以服务器一次默认并且最多返回 20 条记录。但对于有数据大量获取需求的开发者来说,只能放弃云开发吗?答案是no。
微信团队之前在云课程上就已经分享了打破数据库列表限制的2种方法,通过云函数最多可获得100条数据。(如果你也想上这类干货课程,可以点击链接填问卷,我们将根据大家的需求确定课程内容,并将于近期上线课程,敬请关注公众号。)
这次的方法分享是以音乐播放器小程序为实例,通过云函数调用云数据库,实现用户上传音乐的功能。
音乐播放器的核心功能是播放歌曲,也就是需要它能够获取数据库所存储的歌曲信息,然后传到小程序端,去实现播放器的播放、暂停、切换。
01 上传歌曲信息至云数据库
歌曲信息包括id、歌曲名、歌手、封面、音频文件等。
playlist: [{_id: '',cover: '',singer: '',title: '',src: '' }],复制代码02 利用云函数获取数据列表
getlist(){let that = this;wx.cloud.callFunction({name: ’getmlist’,//自己的云函数名称success: res=>{wx.stopPullDownRefresh()if(res.result){let playlist = res.result.dataconsole.log({playlist})if(playlist = undefined playlist.length == 0){wx.showToast({title: ’no data’,})}else{that.setData({isShowArtcle: true,playlist: playlist,})}} },fail:err => {wx.stopPullDownRefresh()wx.showToast({title: ’no data’,})}}) } 复制代码然而目前的做法只能获取20条数据,也不能支持用户上传音乐文件并正常加载播放。为了实现这一功能,需要我们设置云函数,调用云数据库,从而打破数据限制。
方法1:分页获取数据
这个方法是将数据分为若干页,用户可以通过选择页数去获取更多的数据。这也就需要指定skip,设置分页,从第 0 条记录开始取。假设一页 10 条,现在要取第 2 页,则可以指定 skip 10 条记录。
代码示例如下:
//云函数入口文件 const cloud = require('wx-server-sdk') cloud.init()//云函数入口函数 exports.main = async (event, context) => {const db = cloud.database()db.collection('musiclist').where({// 填入当前用户 openid_openid: 'xxx', })//假设一页有10条数据.skip(10) .limit(10) .get().then(res => {console.log(res.data)}).catch(err => {console.error(err)})}复制代码方法2:获取所有数据
这个方法是用户可以直接获取所有数据,但因为默认limit100条,可能一个请求无法取出所有数据,所以需要分批次获取,将集合中的所有歌曲信息获取出来。
代码示例如下:
//云函数入口文件 const cloud = require('wx-server-sdk')const db = wx.cloud.database() cloud.init()//云函数入口函数 exports.main = async (event, context) => {getall:async(){const db = wx.cloud.databaseconst Max_limit = 100// 先取出集合记录总数const countResult = await db.collection('musiclist').count()const total = countResult.total// 计算需分几次取const batchTimes = Math.ceil(total / Max_limit)const tasks = []for(let i = 0; i < batchTimes; i++) {const promise = db.collection('musiclist').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,})))} }复制代码这两类方法,本质上是多次通过云函数获取数据,最终成功获取所有集合数据。
因为云函数端因属于管理端,所以它可以统计所有集合的记录数。同时云函数之间也可互相调用,还能通过云函数后端 SDK 搭配使用多种服务,在数据获取上有着一定的优势。当大家在使用云开发时,不妨多利用云函数进行数据库和存储的操作。
互动福利
扫码关注公众号,回复关键词『音乐』,就能获取本次实例音乐播放器的源码包。
转载于:https://juejin.im/post/5cf0ca966fb9a07eb30961a7
总结
以上是生活随笔为你收集整理的码code | 巧用2种方法,打破20条云开发数据库限制的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: MySQL的优化与执行
- 下一篇: T-SQL问题解决集锦——数据加解密