我们知道,在小程序的开发中,一般请求云数据库的数据时,单次最多返回20条,使用云函数获取单次最多返回100条。
我们在进行学区查询小程序开发时,也遇到了数据读取限制的问题,因此尝试过使用云函数的方式获取,但是最后总是无法得到数据。遂尝试数据库逐次获取,最后成功,现将解决办法写下,希望对大家有帮助。
主要思路
首先,使用数据库查询的方式一次只能返回20条数据是无法改变的,所以主要思路就像大家想的那样,逐次获取,再合并到一起。话不多说,看代码吧!
(建议先了解以下Promise的用法,大致是用来解决异步问题的,这里不赘述)
- 首先,我们需要拿到目标查询的总条数,函数如下:
/**获取数据长度开始 */
function getTotal(e) {
return new Promise((resolve, reject) => {
collection.
where({
street: _.eq(e)
}).count()
.then(
res => {
console.log("当前街镇联想查询的总条数:" + res.total),
resolve(res.total)
}
).catch(err => {
console.error(err),
reject("查询失败")
});
})
}
/**获取数据长度结束 */
- 其次,我们需要写一个函数,目的是每次获取20条结果
/**单次查询函数 */
function getResultSkip(value, skip) {
return new Promise((resolve, reject) => {
let selectPromise;
console.log("拿到的值是" + value);
if (skip > 0) {
selectPromise = collection.
where({
street: _.eq(value)
}).skip(skip).get()
} else {
selectPromise = collection.
where({
street: _.eq(value)
}).get()
}
selectPromise.
then(
res => {
console.log(res.data),
resolve(res.data)
}
).catch(err => {
console.error(err)
reject("查询失败!")
});
})
}
/** 单次查询函数结束*/
3.最后,就是要有一个调用以上两个函数的入口,和整合查询结果的过程
/**
* 获取结果list
*/
let list = [];
new Promise((resolve, reject) => {
getTotal(e.target.dataset.item._id).then(
res => {
let count = res;//获取待查询的数据总数
for (let i = 0; i < count; i += 20) {
getResultSkip(e.target.dataset.item._id, i).then(
res => {
list = list.concat(res);
if (list.length == count) {//当查询结果列表的长度等于count,即结束循环
if (list.length != 0) {
this.setData({
address: list
})
} else {
this.setData({
address: []
})
}
resolve(list)
}
}
).catch(err => {
console.error(err),
reject('查询失败')
})
}
}
)
})
/**
* 获取结果list结束1
*/