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 : {"$near" : [11, 11], "$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中最为基础的命令。

MongoDB(课时25 地理信息索引)的更多相关文章

  1. mongoDB常见的查询索引(三)

    1. _id索引     _id索引是绝大多数集合默认建立的索引     对于每个插入的数据,MongoDB会自动生成一条唯一的_id字段. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  2. 第30章:MongoDB-索引--地理信息索引

    ①地理信息索引 地理信息索引分为两类:2D平面索引,另外就是2DSphere球面索引.在2D索引里面基本上能够保存的信息都是坐标,而且坐标保存的就是经纬度坐标. 范例:定义一个商铺的集合 db.sho ...

  3. MongoDB 常见的查询索引

    常见的查询索引 _id索引         _id 索引是绝大多数集合默认建立的索引.对于每一个插入的数据.MongoDB 会自己主动生成一条唯一的 _id 字段. 1 2 3 4 5 6 7 8 9 ...

  4. 【mongoDB中级篇②】索引与expain

    索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...

  5. MongoDB系列四(索引).

    一.索引简介 再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似.有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高 ...

  6. MongoDB优化,建立索引实例及索引机制原理讲解

    MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...

  7. Mongodb 笔记04 特殊索引和集合、聚合、应用程序设计

    特殊索引和集合 1. 固定集合:固定集合需要事先创建好看,而且它的大小是固定的.当固定集合被占满时,如果再插入新文档,固定集合会自动将最老的文档从集合中删除. 2. 创建固定集合:db.createC ...

  8. mongodb学习笔记之索引(转)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  9. MongoDB(课时22 过期索引)

    3.6.2 过期索引 在一些程序的站点会出现若干秒之后信息被删除的情况,例如:手机信息验证码,那么在MongoDB里面可以轻松实现过期索引.但这个时间往往不怎么准确. 范例:设置过期索引(实现过期索引 ...

随机推荐

  1. owl.carousel

    简介 Owl Carousel 是一个强大.实用但小巧的 jQuery 幻灯片插件,它具有一下特点: 兼容所有浏览器 支持响应式 支持 CSS3 过度 支持触摸事件 支持 JSON 及自定义 JSON ...

  2. Impala shell详解

    不多说,直接上干货! 查看帮助文档 impala-shell -h 刷新整个云数据 impala-shell -ruse impala;show tables; 去格式化,查询大数据量时可以提高性能 ...

  3. RPC和RabbitMQ

    在单台机器或者单个进程中,如果要调用某个函数,只需要通过函数指针,传入相关参数,即可调用成功并获得结果.但如果是在分布式系统中,某个进程想要调用远程机器上的其它进程提供的方法(服务),就需要采用RPC ...

  4. tortoisegit 代码的回滚方式 --两种

    TortoiseGit有两种回滚代码方式, 一种是导出指定版本代码为zip格式,不影响源代码:另一种是直接在源代码上回滚, 指定版本之后写的代码都会被删除.下面分别介绍这两种方法: 首先进入版本日志对 ...

  5. 让nodepad++编辑时链接能双击打开

    让nodepad++编辑时链接能双击打开,Notepad++自动把代码或编辑状态里的链接或URL地址转成可点击的链接,当你双击该URL会打开相应的网页地址,不用复制地址到浏览器打开了,非常方便好用. ...

  6. Django框架----render函数和redirect函数的区别

    render函数和redirect函数的区别: render:只会返回页面内容,但是未发送第二次请求 redirect:发挥了第二次请求,url更新 具体实例说明 render: redirect:

  7. cursor图标自定义

    cursor: url(./images/favicon.ico), auto; 首先auto必须加上,其次必须使用ico文件,目前来说ico文件没有兼容性问题,ico格式怎么转? 传送门:http: ...

  8. cache与buffer

    Cache 缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的 ...

  9. centos下nginx安装与配置

    nginx依赖以下模块: l  gzip模块需要 zlib 库 l  rewrite模块需要 pcre 库 l  ssl 功能需要openssl库 tar xzvf nginx-1.9.15.tar. ...

  10. Django 编写自定义的 404 / 500 报错界面

    Django 编写自定义的 404 / 500 报错界面 1. 首先 setting.py 文件中的 debug 参数设置成 false ,不启用调试. DEBUG = False 2. 在 temp ...