MongoDB(课时25 地理信息索引)
3.6.4 地理信息索引
地理信息索引分为两类:2D平面索引,2DSphere球面索引。在2D索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标。
范例:定义一个shop的集合
db.shop.insert({loc : [10, 10]}) # loc表示坐标
db.shop.insert({loc : [11, 10]})
db.shop.insert({loc : [10, 11]})
db.shop.insert({loc : [12, 15]})
db.shop.insert({loc : [16, 17]})
db.shop.insert({loc : [90, 90]})
db.shop.insert({loc : [150, 160]})
范例:为shop的集合定义2D索引
db.shop.ensureIndex({"loc" : "2d"}) # 2d不能写成2D
(automatically 机械的,自动的)
这个时候shop集合就可以实现坐标位置的查询了,而要进行查询有两种查询方式:
- "$near"查询:查询距离某个点最近的坐标点
- "$geoWithin"查询:查询某个形状内的点
范例:查询坐标是:[11, 11]附近的点
db.shop.find({loc : {"$near" : [11, 11]}})
执行上面代码会将数据集合里面的前100 个点的信息都返回。
现在设置范围——两点距离最大为5:
范例:设置范围
db.shop.find({loc : {"maxDistance" : 5}}) # "$maxDistance"最大距离是5(此处为欧式距离)
注意一点,在2D索引里面支持最大距离,但是不支持最小距离。
但可以使用"$geoWithin"设置一个查询范围,设置范围如下:
矩形范围($box):{"$box" : [[x1, y1], [x2, y2]]}
圆形范围($center):{"$center" : [[x1, y1], r]}
多边形($polygon):{"$polygon" : [[x1, y1], [x2, y2], [x3, y3],...]} # polygon多边形
范例:查询矩形
db.shop.find({loc : {"$geoWithin" : {"$box" : [[9, 9], [11, 11]]}}})
范例:查询圆形
db.shop.find({loc : {"$geoWithin" : {"$center" : [[10, 10], 2]}}})
在MongoDB里面,除了一些支持操作函数之外,还有一个重要的命令:runCommand(),这个函数可以执行所有的特定的MongoDB命令。
范例:利用runCommand()实现信息查询
db.runCommand({"geoNear" : "shop", near : [10, 10], "$maxDistance" : 5, num : 2})
db.runCommand({"geoNear" : "shop", near : [10, 10], maxDistance : 5, num : 2})
results中有两个结果,即返回两条数据;
"nscanned":33,表示扫描了33条数据;
"avgDistance":0.5,表示扫描平均距离0.5;
"maxDistance":1,表示最大距离1;
"time":11,表示扫描用时11毫秒。
runCommand命令是MongoDB中最为基础的命令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)