geonear 查询失败主因是未建地理索引或 point 字段格式错误;需在 schema 中配置 "point": {"type": "2dsphere"} 并上传,且查询/插入必须用 geo.point 或标准 geojson 格式,坐标顺序为[经度,纬度]。

geoNear 查询必须先建地理位置索引
直接用 db.command.geoNear 却查不到数据,或者报超时、空数组,大概率是没建索引。uniCloud 对 point 字段不做默认索引,必须手动声明。
- 打开
uniCloud-aliyun/database/xxx.schema.json(xxx 是集合名),在field节点里确认该字段类型为"type": "geoPoint" - 在
index节点中添加地理索引配置:"point": {"type": "2dsphere"} - 右键该 schema 文件 → 「上传 DB Schema」,仅保存文件不生效
- 验证是否成功:进 uniCloud Web 控制台 → 数据库 → 点击集合 → 「索引管理」,应能看到
point_2dsphere
geoNear 的 point 字段格式不能错
geoNear 对 point 字段的结构极其敏感,错一个括号或类型就返回空结果。常见错误是混用数组和对象写法,或用了字符串经纬度。
- 插入时必须用
new db.Geo.Point(longitude, latitude)或{ type: 'Point', coordinates: [longitude, latitude] } - 查询时
geometry参数也必须匹配:用new db.Geo.Point(113.111, 23.111),不能传[113.111, 23.111]或字符串 - 注意坐标顺序:GeoJSON 规定是
[经度, 纬度],和uni.getLocation返回的{ longitude, latitude }一致,别反了 - 示例正确写法:
db.collection('store').where({ point: db.command.geoNear({ geometry: new db.Geo.Point(113.111, 23.111), maxDistance: 5000 }) }).get()
前端直连 geoNear 有环境限制
H5 端默认禁用 geoNear,微信小程序和 App 端可用,但需确认运行环境支持地理查询能力。
- H5 必须在
manifest.json中显式开启:"h5": { "useUniCloud": true },否则geoNear调用直接静默失败 - 真机调试时,确保定位权限已授权,且
uni.getLocation返回的是gcj02坐标系(高德/腾讯地图标准),若用wgs84可能偏差极大 - 云函数内调用不受前端限制,且可结合聚合管道做更复杂计算(如按距离排序 + 分页),推荐生产环境优先走云函数
距离单位和精度容易被忽略
maxDistance 和 minDistance 单位是「米」,但实际返回的距离值是「米」还是「千米」取决于你用的 SDK 版本和数据库服务商,阿里云 uniCloud 返回的是米,腾讯云同理——但别依赖前端计算,应在云函数里用 $geoNear 的 distanceField 显式输出。
- 不要在前端用
Math.sqrt(...)自己算两点距离,误差大且无法利用数据库索引 - 如果需要按距离升序排列,
geoNear默认就是由近到远,无需再.orderBy('distance', 'asc') - 查「附近 3 公里」却只返回 1 条?检查
maxDistance: 3000是否写成3——单位不是千米 - 精度问题:GCJ-02 坐标系本身有偏移,若与高德地图 SDK 混用,需确认双方坐标系一致,否则
geoNear结果和地图标记位置对不上










