MongoDB的索引(五)

太阳2年前技术文章525


十一、2d Indexes


1、在MongoDB 2.2版本之前或者地址位置字段没有使用GeoJSON进行存储的情况下,我们使用2d索引比较多。

2、2d索引一般是用来计算平面上的计算,对于球面的一些几何计算,或者以GeoJSON形式来进行存储的字段,需要使用2dsphere索引

3、2d索引本质上也是一个稀疏索引

4、2d索引不支持collation选项

5、创建语法

db.<collection>.createIndex( { <location field> : "2d" ,
                               <additional field> : <value> } ,
                             { <index-specification options> } )
                             
db.collection.createIndex( { <location field> : "2d" } ,
                           { min : <lower bound> , max : <upper bound> } )      //设置最大最小边界值和精度。默认情况下,最大值和最小值的范围是[ -180 , 180 ),精度是26位的精度

6、对于2d复合索引来讲,必须将2d索引字段放在复合索引最前缀

> db.places.createIndex( { state:1,"locs": "2d"} )
{
	"ok" : 0,
	"errmsg" : "2d has to be first in index",
	"code" : 16801,
	"codeName" : "Location16801"
}

7、查询语法

1)查询在指定范围内所有的点 - 平面

语法:

db.<collection>.find( { <location field> :
                         { $geoWithin :
                            { $box|$polygon|$center : <coordinates>
                      } } } )

示例:

查询在[ 0 , 0 ],[ 100 , 100 ]之内的所有点:
db.places.find( { loc :
                  { $geoWithin :
                     { $box : [ [ 0 , 0 ] ,
                                [ 100 , 100 ] ]
                 } } } )
                 
查询以[-74, 40.74 ]为中心,10为半径的范围内所有的点:     
db.places.find( { loc: { $geoWithin :
                          { $center : [ [-74, 40.74 ] , 10 ]
                } } } )

2)查询球面中的范围查询

语法:

db.<collection>.find( { <location field> :
                         { $geoWithin :
                            { $centerSphere : [ [ <x>, <y> ] , <radius> ] }
                      } } )

示例:

db.<collection>.find( { loc : { $geoWithin :
                                 { $centerSphere :
                                    [ [ 88 , 30 ] , 10 / 3963.2 ]
                      } } } )

3)查询一个平面的临近点

语法:

db.<collection>.find( { <location field> :
                         { $near : [ <x> , <y> ]
                      } } )

示例:

db.place.find( { loc :{ $near : [ 23 , 57 ]} } )

4)精确匹配一个点

语法:

db.<collection>.find( { loc: [ <x> , <y> ] } )

示例:

db.place.find( { loc : [ 23 , 57 ] } )


十二、Hash Indexes

1、hash索引可以做分片键,这会使数据分布更加随机性

2、hash索引会通过一个hash函数来计算该文档的hash索引值,hash支持嵌套文档,但是不支持多键。

3、hash索引是由MongoDB实例来自动计算使用hash索引的,应用程序无需对其进行hash计算

4、创建hash索引语法

db.collection.createIndex( { _id: "hashed" } )

5、hash索引不支持创建复合索引

6、hash索引仅支持等值查询,也可以在相同的字段创建普通索引,范围查询会优先使用普通索引,等值查询优先使用hash索引。



相关文章

二进制日志(binlog)

二进制日志(binlog)

一、简介二进制日志(binlog)记录了数据库中所有的DDL和DML(除select语句)操作,语句以“事件”的形式保存,记录了数据库的更改变化,在主从复制和数据恢复中起着重要的作用。但要注意的一点是...

达梦数据库初始化

达梦数据库初始化

1、dm数据库初始化认证dm数据库默认开启了ssl,在第一次登录时,使用SYSDBA用户登录,需要通过命令指定对应的ssl文件。不然会出现ssl 初始化失败的报错./disql SYSDBA/SYSD...

CDP实操--配置HDFS的Ranger策略验证(一)

CDP实操--配置HDFS的Ranger策略验证(一)

1.1HDFS的Ranger策略验证确保hdfs的配置页面里已经勾选了“Enable Ranger Authorization”在terminal中,kerberos登录到hdfs用户并将/etc/h...

Kubernetes源码解读(三)-- Indexer和ThreadSafeStore源码分析

Kubernetes源码解读(三)-- Indexer和ThreadSafeStore源码分析

Indexer主要提供一个对象根据一定条件检索的能力,典型的实现是通过nameapce/name来构造key,通过ThreadSafeStore 来存储对象。换而言之,Indexer主要依赖于Thre...

PostgreSQL 锁等待排查

PostgreSQL 锁等待排查

说明在数据库中,常用 锁 和 MVCC 来保障事务的一致性及提高并发性。锁问题的定位和排查也是数据库运维人员必会的技能,本篇文章介绍 PostgreSQL 如何排查定位锁堵塞问题。1. Postgre...

MySQL 同步方式

同步方式一、分类同步大致为异步、半同步、增强版同步、全同步;二、详情1.异步复制MySQL 默认的复制策略,Master处理事务过程中,将其写入Binlog就会通知Dump thread线程处理,然后...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。