需求背景
我们如果使用小程序“云开发功能”,在调用(查询)数据时,会用到这样的代码:
const db = wx.cloud.database()
db.collection('todos').get({
success: function(res) {
// res.data 是一个包含集合中有权限访问的所有记录的数据,不超过 20 条
console.log(res.data)
}
})
wx.cloud.database() 是使用云开发数据库的的“入口”,把它赋给常量 db ,以对象的形式方便后续调用相关的数据库操作方法(增、删、改、查)。并最终通过 .get() 方法获取数据。
但我们知道,“小程序端在获取集合(数据表)数据时服务器一次默认并且最多返回 20 条记录,云函数端这个数字则是 100。”也就是说使用云开发的话,小程序查询数据库存在一定的局限性,那有没有办法突破这个限制?
一、使用 for 循环
虽然存在一次性只能获取20条数据的限制,但如果想突破20条限制,同时查询数据并不是很多的情况下(大于20,小于100。),我们可以使用 for 循环。
思路:想要获取N条数据,循环N次,一次循环查询1条。
for (let i = 0; i < 30; i++) { // 查询30次
// 数据查询代码
}
思路延伸:我们不妨把格局放大一些,既然一次能查20条,那循环N次查询后,能获取的数据岂不是 20*N ?事实正是如此。
二、获取所有数据
有时候我们需要获取数据库中所有的数据,我的实现思路是:
1、获取数据总条数。
使用 wx.cloud.database() 的 .count() 方法来动态获取数据库某个集合的总条数,在页面加载的时候载入。
getCount() { // 1、获取总条数,写入data
db.collection('todus').count().then(res => {
this.setData({
total : res.total
})
})
},
onLoad: function() {
// 页面加载时调用方法,提前获取记录总条数,以供后续使用
this.getCount()
}
2、计算循环次数(组数)
将总条数设置为变量 total,用 20 对 total 取模( count % 20 ),为 0 则组数为 count / 20 ,不为 0 说明除不尽,有余数则需要多循环1次,所以组数为 (count / 20) + 1 。使用 parseInt() 方法对计算结果取整。
这样就得到了需要循环的次数 group 。得到循环次数后,就可以使用 for 循环对数据库批量查询了。最终就能得到集合里所有的数据了。
let count = this.data.total
let group = 0 // 每组最多获取20条信息,获取总的组数
if (count % 20 == 0) {
group = count / 20
} else if (count % 20 != 0) {
group = parseInt(count / 20) + 1 // parseInt() 取整
}
for (let i = 0; i < group; i++) {
// 数据库查询方法
}
注意事项
写数据库查询方法时,要设置一定的查询条件,确保每一次循环查询得到的结果是连贯且不重复的。否则哪怕循环查询一万次也是得到相同的结果。大家可以参考我的另一篇文章:
https://blog.csdn.net/weixin_45828020/article/details/131344489