mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询

mongodb11天之屠龙宝刀(五)lbs地理位置检索:存储经纬度以及查询

基本原理

LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率。 mongodb地理位置索引,2d和2dsphere,对应平面和球面。 mongodb位置查询文档 实现原理:参考文章

两种索引方式

地理位置索引,必须创建索引才可以能查询,目前有两种索引。

2d index:

使用2d index 能够将数据作为2维平面上的点存储起来,在MongoDB 2.2以前推荐使用2d index索引。

2dsphere index:

2dsphere index 支持球体的查询和计算,同时它支持数据存储为GeoJSON 和传统坐标。

3种距离单位

米(meters) 平面单位(flat units,可以理解为经纬度的“一度”) 弧度(radians)

2d索引能同时支持center和center和center和centerSphere, 2dsphere索引支持centerSphere。centerSphere。centerSphere。 center默认是度,$centerSphere默认距离是弧度

地理位置索引创建与查询

地理位置索引-2d索引

首先需对col里的w设置索引为’2d’,方可进行$near查询

db.location.ensureIndex({w:"2d"})  

w对应的经纬度外镶字段 创建了地理位置索引,默认mongoDB**不允许查询超过180的值**

2d索引查询方式
$near 附近的点
db.location.find({w:{$near:[1,1]}})

$near会返回最近的100个记录. 地理位置索引-2d索引-$near 限制返回的距离的远近,限制最远距离:限制最近距离:maxDistance单位是弧度, 地球表面1弧度距离约为6378137米, 0.001弧度距离为6378米

$geoWithin 某个形状内的点

地理位置索引-2d索引 $geoWithin 形状的表示 由于$geoWithin是查询某个形状内的点,所以先要学会如何表示形状.

地理位置索引-2d索引 $geoWithin 查询矩形中的点

db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
db.location.find({w:{$geoWithin:{$box:[[1,1],[2,3]]}}})

地理位置索引-2d索引 $geoWithin 查询圆形中的点

db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})

地理位置索引-2d索引 $geoWithin 查询多边形中的点

db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
geoNear

地理位置索引-2d索引 geoNear geoNear查询使用runCommand命令进行使用,db.runCommand({geoNear:,near:[,],minDistance:(对2D索引无效,2Dsphere有效),maxDistance:(最大距离),num:(返回结果个数)})

db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})
地理位置索引-2dsphere索引

查询案例:

db.user.find({"geo": {$near: [118.10388605,24.48923061], $maxDistance:0.1}},{id:1, name:1, state:1, geo:1}).limit(1).pretty()
2dsphere操作案例
插入 lbs;
db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.332264, 23.156206]  
        },  
        name: "广州东站"  
    }  
)  

db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.330611, 23.147234]  
        },  
        name: "林和西"  
    }  
)  

db.lbs.insert(  
    {  
        loc:{  
            type: "Point",  
            coordinates: [113.328095, 23.165376]  
        },  
        name: "天平架"  
    }  
)  

插入结果,IDE显示如下

地理位置索引
db.lbs.ensureIndex(  
    {  
        loc: "2dsphere"  
    }  
) 

创建完成之后在indexes中出现了新的索引形式即为成功

#注意此调用情况下,maxdistance 单位是米

db.lbs.find(  
    {  
        loc: {  
            $near:{  
                $geometry:{  
                    type: "Point",  
                    coordinates: [113.323568, 23.146436]  
                },  
                $maxDistance: 1000  
            }  
        }  
    }  
)  

最终查询结果下:

查询更多字段

查询更多字段时,执行:

 db.lbs.find( 
     { 
         loc: { 
 near:{near:{near:{                   geometry:{ 
                     type: “Point”, 
                     coordinates: [113.323568, 23.146436] 
                 }, 
                 $maxDistance: 1000 
             } 
         } 
     }  ,{此处添加比如:type:1,name:1} 
 )  
                 $(".MathJax").remove();             

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

文本分析了4000万条Stack Overflow讨论帖,这些是程序员最推荐的编程书(附代码)

1953
来自专栏IT技术精选文摘

MySQL索引设计概要

在关系型数据库中设计索引其实并不是复杂的事情,很多开发者都觉得设计索引能够提升数据库的性能,相关的知识一定非常复杂。 ? 然而这种想法是不正确的,索引其实并不是...

3796
来自专栏数据和云

Oracle性能优化-子查询到特殊问题

编辑手记:前面我们介绍常用的子查询优化方法,但总有一些情况时在规律之外。谨慎处理方能不掉坑。 前文回顾: 性能优化之查询转换 - 子查询类 将SQL优化做到极...

3507
来自专栏desperate633

浅谈索引的优缺点和建立索引的原则

1221
来自专栏大数据

大数据干货系列(五)-Hive总结

Hive总结 一、本质 Hive基于一个统一的查询分析层,通过SQL语句的方式对HDFS上的数据进行查 询、统计和分析。 二、四大特点** • Hive本身不存...

2699
来自专栏CSDN技术头条

MySQL查询优化之道

查询优化器的任务是发现执行 SQL 查询的最佳方案。大多数查询优化器,要么基于规则、要么基于成本。

1584
来自专栏美团技术团队

美团点评SQL优化工具SQLAdvisor开源

介绍 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提升程序性能,还能够降低线上故障的概率。 目前常用的 SQL 优...

4606
来自专栏jouypub

MySQL查询语句优化

在项目中经常和MySQL数据库打交道,写过各种各样的SQL,也遇到过各种问题,针对遇到的各种场景,记录一些解决方案,主要是MySQL索引问题。

1691
来自专栏Python爬虫实战

MySQL 从零开始:04 表的增删改查

在上一小节中介绍了 MySQL 数据库的一些最最最基础的入门级也是必须要掌握的10条语句,本节将继续深入学习 MySQL 的增删改查语句。本节讲的增删改查是相对...

851
来自专栏MongoDB中文社区

优化MongoDB复合索引

对于一个MongoDB的复杂查询,如何才能创建最好的索引?在本篇文章中,我将展现一种给读请求定制的索引优化方法,这种方法会考虑读请求中的比较,排序以及范围过滤运...

1892

扫码关注云+社区

领取腾讯云代金券