调用云函数,每一次最多只能获取100条,但很多情况下我们可能需要所有用户id等的清单,而这个清单很有可能超过100条,这时我们需要解决这个100条限制带来的返回数据不全的问题:
- 获取符合条件数据的总数,count
- 对总数进行划分,分批调用,每批获取100(或者20,都可以)条
- 将几批获取的数据拼接在一起
一般情况下,以上方法都是可行的。但我最近遇到一个需求,以上方法看起来不可行:
找出某指定点附近1千米范围内所有点的清单
按照以上的方法,需要先统计该指定点附近1千米范围内所有点的总数,以便知道需要分几批获取清单数据。
以下是我使用geoNear统计总数的示例代码,可惜的是,这段代码会报错,报错信息大概是“先...,如果仍然有问题可联系客服”(下次找到原始报错信息后,再补充在这里),这个报错信息太general,我无法找出问题并fix。
await db.collection('your_location_table').aggregate().match({
location: _.geoNear({
geometry: db.Geo.Point(longitude, latitude),//指定点
minDistance: 0,
maxDistance: 1000, //1km
})
}).group({
"_id": null,
'count': {"$sum": 1}
}).end()
网上查阅一番后,我看到有人总结:geoNear不能与count联用,以统计总数。 绝望中...
果断放弃使用geoNear+count的方式统计总数,使用如下方式直接获取清单数据,亲测可以用,大家可以试试.
try {
let count = 999999999
let _point = []
for (let i = 0; i < count; i += 100) {
_point = await getList(longitude, latitude, 1000, i)
points = points.concat(_point)
if (!_point || _point.length < 100) { //退出机制
_point = []
break;
}
_point = []
}
} catch (err) {
console.log(err)
}
async function getList(longitude, latitude, radius, skip) {//分批
let list =
await db.collection('your_location_table')
.orderBy('createTime', 'desc')
.where({
location: _.geoNear({
geometry: db.Geo.Point(longitude, latitude),
minDistance: 0,
maxDistance: radius
})
}).field({
user_id: true
}).skip(skip).get();
return list.data;
}
注意,your_location_table的location字段要加索引哦,可参见:# geoNear不起作用?因为有件事你没做!
我坚信一个问题会有多种解决方法,以上是我的解决方法,你的解决方法如果不一样,欢迎留言,先感谢分享!