当云函数【100条返回数据限制】遇上geoNear

82 阅读2分钟

调用云函数,每一次最多只能获取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不起作用?因为有件事你没做!

我坚信一个问题会有多种解决方法,以上是我的解决方法,你的解决方法如果不一样,欢迎留言,先感谢分享!