.NET Core 5.0对接MongoDB查附近位置提示$geoNear找不到索引
错误原因
MongoDB 所有地理位置类查询(包括你用到的Near方法)都要求对应地理字段预先创建空间索引,你存储的GeoJsonPoint类型字段需要配套2dsphere索引,当前MdbTrip集合的location字段未创建该索引,因此查询时抛出找不到索引的报错。
修复方案
你可以选任意一种方式创建索引,索引只需创建一次,后续无需重复操作。
方案1:在.NET Core代码中自动创建(推荐)
适合应用部署时自动初始化,不需要手动操作数据库,在服务启动的初始化逻辑、或者你操作MdbTrip集合的业务类构造函数中添加如下代码即可:
// 仅第一次执行会创建索引,后续重复调用不会产生额外开销 var indexKeys = Builders<MdbTrip>.IndexKeys.Geo2DSphere(x => x.location); await _trips.Indexes.CreateOneAsync(new CreateIndexModel<MdbTrip>(indexKeys));
方案2:在Mongo Shell中手动创建(适合快速调试验证)
直接连接MongoDB执行以下命令即可:
// 切换到你的业务库 use VtrackDB // 为location字段创建2dsphere索引 db.MdbTrip.createIndex({"location":"2dsphere"})
额外注意事项
- 你当前代码中
Near方法传入的第三个参数200单位是米,和WGS84地理坐标系匹配,该参数不需要修改 - 存储
location字段时要严格保持经度在前、纬度在后的坐标顺序,和你构造查询点时GeoJson.Geographic(myLocation.lng, myLocation.lat)的顺序一致,否则会出现查询结果错误 - 索引创建完成后无需重启服务,重新执行查询逻辑即可正常返回200米范围内的点位数据
内容的提问来源于stack exchange,提问作者gamal
相关产品推荐
相关产品推荐

