mongodb 索引分类
一、 普通索引篇
1、创建索引
创建索引:db.person.ensureIndex({"age":1})。这里我们使用了ensureIndex在age上建立了索引。“1”:表示按照age进行升序,“-1”:表示按照age进行降序。
2、复合索引
在多个键上建立的索引就是复合索引,有时候我们的查询不是单条件的,可能是多条件,比如查找年龄在20~30名字叫‘ryan1’的同学,那么我们可以建立“age”和“name”的联合索引来加速查询。
db.person.find({"age":{"$gte":20,"$lte":30},"name":"ryan1"})
3、唯一索引
唯一索引可以确保集合的每个文档的指定键都有唯一值。如果想保证不同文档的“name”键拥有不同的值,在“name”键上创建一个唯一索引就可以了。
db.person.ensureIndex({"name":1},{"unique":true});
然后用db.person.getIndexes()命令,查看目前person集合所有的索引。
也可以创建复合的唯一索引。创建复合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。
db.person.ensureIndex({"name":1,"age":1},{"unique":true});
4、稀疏索引
唯一索引会把null看作值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在有些情况下,你可能希望唯一索引只对包含相应键的文档生效。这个时候我们可以用到MongoDB中的稀疏索引。该索引与关系型数据库中的稀疏索引是完全不同的概念。MongoDB中的稀疏索引只是不需要将每个文档都作为索引条目。
比如,如果有一个可选的mobilephone字段,但是,如果提供了这个字段,那么它的值必须是唯一的:
db.person.ensureIndex({"mobilephone":1}{"unique":true,"sparse":true});
稀疏索引不必是唯一的。只要去掉unique选项,就可以创建一个非唯一的稀疏索引。在下篇,将会讲解mongodb的稀疏索引。
二、全文索引、地理位置索引
主要介绍MongoDB中一些常用的特殊索引类型,主要包括:
- 用于简单字符串搜索的全文本索引;
- 用于球体空间(2dsphere)和二维平面(2d)的地理空间索引。
1、全文索引
MongoDB有一个特殊的索引用在文档中搜索文本,之前的博客都是用精确匹配来查询字符串,这些技术有一定的限制。在搜索大块文本的速度非常慢,而且无法处理自然语言礼节的问题。全文本索引使用的是“倒排索引”的思想来做的,和当前非常开源的lucene(全文检索,Apacle基金会下的开源项目)项目是一样的思想来做的。使用全文本索引可以非常快的进行文本搜索,MongoDB支持多种语言,可惜在免费版中,并不支持世界第一的火星文语言(汉语)。查MongoDB的官网可以看到,在企业版中是支持汉语的全文索引的。
如果公司用的是免费版的MongoDB,而又需要用到中文的全文索引,建议使用lucene或者solr等开源项目来做。(没钱就得用技术来补,赤裸裸的现实。)
使用全文本检索需要专门开启这个功能才能进行使用。启动MongoDB时指定--setParameter textSearchEnabled=true选项,或者在运行时执行setParameter命令,都可以启用全文本索引。
db.adminCommand({"setParameter":1,"textSearchEnabled":true});
或者使用命令:
mongod --setParameter textSearchEnabled=true
2、2dsphere索引
2dsphere索引是MongoDB最常用的地理空间索引之一,用于地球表面类型的地图。允许使用GeoJSON格式(http://www.geojson.org)指定点、线、多边形。
点可以用形如[longitude,latitude]([经度,纬度])的两个元素的数组表示("loc"字段的名字可以是任意的,但是其中的子对象是有GeoJSON指定的,不能改变):
{
"name":"beijing",
"loc":{
"type":"Point",
"coordinates":[40,2]
}
}
线可以用一个由点组成的数组来表示:
{
"name":"changjiang",
"loc":{
"type":"Line",
"coordinates":[[1,2],[2,3],[3,4]]
}
}
多边形的表示方式与线一样,但是“type”不同:
{
"name":"shenzhen",
"loc":{
"type":"Polygon",
"coordinates":[[1,2],[2,3],[3,4]]
}
}
创建2dsphere索引:
db.mapinfo.ensureIndex({"loc":"2dsphere"})
地理空间查询的类型有三种:交集(intersection)、包含(within)、接近(nearness)。查询时,需要将希望查找的内容指定为形如{"$geometry":geoJsonDesc}的GeoJSON对象。
使用“$geoIntersects”查询位置相交的文档:
var customMapinfo = {
"type":"Polygon",
"coordinates":[[12.2223,39,4424],[13.2223,38,4424],[13.2223,39,4424]]
}
db.mapinfo.find({
"loc":{"$geoIntersects":{"$geometry":customMapinfo}}
})
这样就会找到所有与customMapinfo区域有交集的文档。
使用“$within”查询完全包含在某个区域的文档:
db.mapinfo.find({
"loc":{"$within":{"$geometry":customMapinfo}}
})
使用“$near”查询附近的位置:
db.mapinfo.find({
"loc":{"$within":{"$geometry":customMapinfo}}
})
3、2d索引
2d索引也是MongoDB最常用的地理空间索引之一,用于游戏地图。2d索引用于扁平表面,而不是球体表面。如果用在球体表面上,在极点附近会出现大量的扭曲变形。
文档中应该使用包含两个元素的数组表示2d索引字段。
{
"name":"node1",
"tile":[32,22]
}
创建索引
db.gameMapinfo.ensureIndex({"tile":"2d"})
使用$near查询点[20,20]附近的文档:
db.gameMapinfo.find({"tile":{"$near":[20,20]}})
使用$within查询出某个形状(矩形、圆形或者多边形)范围内的所有文档。
矩形,可以指定$box选项($box接受一个两元素的数组,第一个元素指定左下角的坐标,第二个元素指定右上角的坐标):
db.gameMapinfo.find({"tile":{"$within":{"$box":[[10,20],[15,30]]}}})
圆形,可以指定$center选项($center接受一个两元素数组作为参数,第一个元素是一个点,用于指定圆心,第二个元素用于指定半径):
db.gameMapinfo.find({"tile":{"$within":{"$center":[[12,12],5]}}})
多边形,可以指定$polygon($ploygon接受一个多元素的数组,每个元素对应多边形的点),下面以一个三角形为例:
db.gameMapinfo.find({"tile":{"$within":{"$polygon":[[0,20],[10,0],[-10,0]]}}})
mongodb 索引分类的更多相关文章
- MongoDB 索引的使用, 管理 和优化
MongoDB 索引的使用, 管理 和优化 2014-03-25 17:12 6479人阅读 评论(0) 收藏 举报 分类: MongoDB(9) [使用explain和hint] 前面讲高级查询 ...
- [DataBase] MongoDB (7) MongoDB 索引
MongoDB 索引 1. 建立索引 唯一索引db.passport.ensureIndex( {"loginname": 1}, {"unique": tru ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- MongoDB索引(一)
原文地址 一.介绍 我们已经很清楚索引会提高查询效率.如果没有索引,MongoDB必须对全部集合进行扫描,即,扫描集合中每条文档以选择那些符合查询条件的文档.对查询来说如果存在合适的索引,则Mongo ...
- MongoDB 索引篇
MongoDB 索引篇 索引的简介 索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度.且添加索引之后的对文档的删除,修改会比以前速度慢.因为在进行修改的时候会对索引进行更新 ...
- SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题
SQL优化 MySQL版 - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...
- MongoDB索引的种类与使用
一:索引的种类 1:_id索引:是绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段2:单键索引: 1.单键索引是最普通的索引 2.与_id索引不同,单键索 ...
- MongoDB索引,性能分析
索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...
随机推荐
- iOS----收集的一些小技巧
1,如何将试图置于最顶层 第一种方法 _myview.layer.zPosition =5; 第二种方法 [self.view insertSubview:_MyView atIndex:999]; ...
- gitHub pull Request记录
1.fork开源项目到自己的gitHub,点fork,然后clone即可 2.提交本地修改,push到自己的代码库 3.点new pull Request,写点备忘信息 注意确保修改的正确性,如果运行 ...
- 04 全局配置,java 编意默认版本,1.6.修改配置
https://www.cnblogs.com/liu-s/p/5371289.html <!-- 修改Intellij Idea 创建maven项目默认Java编译版本 --> < ...
- 安卓环境home assistant搭建
准备搞个智能家居玩玩 先从home assistant(后面简写为HASS)开始吧 莫得树莓派,拿旧手机凑活一下 准备材料: root过的安卓机 一.安卓机Linux环境搭建 个人习惯不详细写基础环境 ...
- 2A3T我的PMP备考及考试心得20181208
2018年的下半年由于工作不是很忙,所以生活中有更好的精力去做些自己的事情.出于工作需要,我决定考个证书充实下自己,在各大网站搜索解惑后决定考PMP,并报了个培训班 一.PMP考试简介 共200道选择 ...
- IDEA搭建spingboot项目
1.Springboot2.x是依赖于JDK1.8及以上版本的.因此先在电脑上安装JDK1.8,由于公司的项目用的是JDK1.7,所以要在JDK1.7的基础上在安装JDK1.8,让两者同时存在于电脑上 ...
- 关于Spring中BeanUtils的一次使用问题记录
1.问题描述:今天在进行前后端联调的时候,发现商品图片不能正常显示: 2.排查过程:查看浏览器控制台,发现调用接口返回的数据关于图片的字段未返回数据: 然后,又跑了一下Dao层的单元测试,从 ...
- JQuery触发hover事件无效时使用js原生的触发事件方法
需求:在开发一个从微信公众号后台管理网页上爬取数据的chrome插件时,有部分页面元素是只显示了部分摘要信息的,需要把鼠标移上去后才能显示全部信息(类似title的弹出显示).这就需要在chrome插 ...
- 004-URL编码转换函数:escape()、encodeURI()、encodeURIComponent()
一.概述 函数出现时间: escape() javascript 1.0 ...
- 测开之路六十六:UI测试平台之处理逻辑和蓝图添加到程序入口
from selenium import webdriverfrom common import get_case_idfrom common.mongo import Mongo class Log ...