MongoDB的索引:

1. _id索引

该索引是大多数集合默认创建的索引,也就是说用户每插入一个数据,MongoDB会自动生成一条唯一的_id字段。

2. 单键索引

单键索引是最普通的索引,它不会自动创建,需要手动创建。

例如:dm.bochao_collection.ensureIndex({name:"zhangsan"})

创建了一个name=zhangsan的索引

> db.bochao_collection.ensureIndex({x:11})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.bochao_collection.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "bochao.bochao_collection"
},
{
"v" : 1,
"key" : {
"x" : 11
},
"name" : "x_11",
"ns" : "bochao.bochao_collection"
}
]

3. 多键索引

多键索引与单键索引类似,区别在于字段的值。

单键索引:值为一个单一的值,例如字符串,数字或者日期。

多键索引: 值具有多个记录,例如数组。

4. 复合索引

当使用多个查询条件时候,可以创建复合索引。

> db.bochao_collection.ensureIndex({x:11,y:22})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
> db.bochao_collection.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "bochao.bochao_collection"
},
{
"v" : 1,
"key" : {
"x" : 11
},
"name" : "x_11",
"ns" : "bochao.bochao_collection"
},
{
"v" : 1,
"key" : {
"x" : 11,
"y" : 22
},
"name" : "x_11_y_22",
"ns" : "bochao.bochao_collection"
}
]

5. 过期索引

过期索引是在一定的时间会自动过期失效的索引

在索引过期后,相应的数据会被自动删除

这将比较适合存储一些在一段时间后会失效的数据,如用户登录信息、日志信息等等

注意:

<1>. 存储在过期索引的字段值类型必须是时间类型,必须是ISODate或者是ISO数组,不能使用时间戳,否则不能自动清除数据。

> db.bochao_collection.ensureIndex({time:1},{expireAfterSeconds:30})
db.bochao_collection.insert({time:new Date(), address:"北京市昌平区"})

这会在30秒钟后自动删除该条数据

<2>. 如果指定了ISODate数组,则按照最小的时间进行删除。也就是说如果有一个最小的时间到达了,则删除该条数据。

<3>. 过期索引不能创建复合索引

<4>. 索引过期按指定时间删除是不精确的。 因为删除过程是后台进程每60S执行一次,有误差

6. 全文索引

对字符串与字符串数组创建全文可搜索的索引

<1>. 创建全文索引

> db.bochao_collection.ensureIndex({article:"text"})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

<2>. 使用全文索引查询

> db.bochao_collection.find({$text:{$search:"aa"}})
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd" }
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg" }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee" }

MongoDB的一个集合中只能创建一个全文索引

# 查询包含多个条件字符串(或的关系),如下:

> db.bochao_collection.find({$text:{$search:"aa bb cc"}})
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd" }
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg" }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee" }

# 查询包含多个条件字符串(与的关系),如下:

> db.bochao_collection.find({$text:{$search:"\"aa\", \"bb\", \"cc\""}})
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd" }

# 按照条件全文检索并且不包含某个字符的查询,如下

> db.bochao_collection.find({$text:{$search:"aa bb -cc"}})
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg" }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee" }

# 全文索引的相似度,使用这样的语法: score:{$meta:"textScore"}

写在查询条件之后可以返回结果的相似度,与sort一起使用,可以达到很好的使用效果。

> db.bochao_collection.find({$text:{$search:"aa bb"}})
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd" }
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg" }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee" }
{ "_id" : ObjectId("55da00670a78029813da6fcc"), "article" : "aa bb" }
> db.bochao_collection.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd", "score" : 1.25 }
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg", "score" : 1.25 }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee", "score" : 1.25 }
{ "_id" : ObjectId("55da00670a78029813da6fcc"), "article" : "aa bb", "score" : 1.5 }
> db.bochao_collection.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
{ "_id" : ObjectId("55da00670a78029813da6fcc"), "article" : "aa bb", "score" : 1.5 }
{ "_id" : ObjectId("55d9fb263b6af5422bb1ed52"), "article" : "aa bb cc dd", "score" : 1.25 }
{ "_id" : ObjectId("55d9fb2e3b6af5422bb1ed53"), "article" : "aa bb ff gg", "score" : 1.25 }
{ "_id" : ObjectId("55d9fb413b6af5422bb1ed54"), "article" : "aa bb hh ee", "score" : 1.25 }

利用这个功能可以实现一个不错的全文检索功能哦

注意:

每次查询,只能使用$text查询

$text查询不能出现在$nor查询中

查询中如果包含了$text,hint将失效

全文索引不支持中文

# 索引的重要属性:

<1>. 索引的名称:自定义索引的名称

> db.bochao_collection.ensureIndex({dcz:1000}, {name:"dczIndex"})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 4,
"numIndexesAfter" : 5,
"ok" : 1
       {
"v" : 1,
"key" : {
"dcz" : 1000
},
"name" : "dczIndex",
"ns" : "bochao.bochao_collection"
}

删除索引:

> db.bochao_collection.dropIndex("dczIndex")
{ "nIndexesWas" : 5, "ok" : 1 }

<2>. 索引的唯一性,unique指定

> db.bochao_c.ensureIndex({m:1,n:1},{unique:true})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

这样创建后就不能插入两条一样的M,N数据了。

<3>. 稀疏索引,使用sparse关键字:

避免为不必要的字段上创建索引,创建语法是:db.collection.ensureIndex({},{sparse:true/false})

> db.bochao3.ensureIndex({m:1},{sparse:true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

7. 地址位置索引

将一些点的位置存储在MongoDB 中,创建索引后,可以按照位置来查找其他点。

子分类:

2d索引:用于存储和查找平面上的点

2dsphere索引:用于存储和查找球面上的点

查找方式:

1. 查找距离某个点一定距离内的点

2. 查找包含在某区域内的点

# 创建2d索引

创建语法:db.collection.ensureIndex({w:"2d"})

2d位置表示方法:经纬度[经度,纬度],取值范围:经度[-180,180] 纬度[-90,90]

查询方式:

1. $near查询:查询距离某个点最近的点:

插入几个平面坐标(经纬度):
> db.location.insert({w:[30,60]})
WriteResult({ "nInserted" : 1 })
> db.location.insert({w:[1,2]})
WriteResult({ "nInserted" : 1 })
> db.location.insert({w:[30,80]})
WriteResult({ "nInserted" : 1 })
> db.location.insert({w:[180,40]})
WriteResult({ "nInserted" : 1 })
> db.location.insert({w:[127,20]})
WriteResult({ "nInserted" : 1 })
查询一下:
> db.location.find()
{ "_id" : ObjectId("55db2ce6a0319a75b8c83ba1"), "w" : [ 30, 60 ] }
{ "_id" : ObjectId("55db2cf5a0319a75b8c83ba2"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("55db2d01a0319a75b8c83ba3"), "w" : [ 30, 80 ] }
{ "_id" : ObjectId("55db2d0ba0319a75b8c83ba4"), "w" : [ 180, 40 ] }
{ "_id" : ObjectId("55db2d13a0319a75b8c83ba5"), "w" : [ 127, 20 ] }
查询距离经纬度[1,1]最近的,看到会返回了全部坐标点,MongoDB默认会返回100个最近的点
> db.location.find({w:{$near:[1,1]}})
{ "_id" : ObjectId("55db2cf5a0319a75b8c83ba2"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("55db2ce6a0319a75b8c83ba1"), "w" : [ 30, 60 ] }
{ "_id" : ObjectId("55db2d01a0319a75b8c83ba3"), "w" : [ 30, 80 ] }
{ "_id" : ObjectId("55db2d13a0319a75b8c83ba5"), "w" : [ 127, 20 ] }
{ "_id" : ObjectId("55db2d0ba0319a75b8c83ba4"), "w" : [ 180, 40 ] }
可以使用$maxDistance关键字来做限制
> db.location.find({w:{$near:[1,1], $maxDistance:80}})
{ "_id" : ObjectId("55db2cf5a0319a75b8c83ba2"), "w" : [ 1, 2 ] }
{ "_id" : ObjectId("55db2ce6a0319a75b8c83ba1"), "w" : [ 30, 60 ] }

2. 使用$geoWithin查询:查询某个形状内的点

形状的表示:

<1>. $box:矩形,使用{$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示

> db.location.find({w:{$geoWithin:{$box:[[10,20],[80,80]]}}})
{ "_id" : ObjectId("55df1696c7913b1f63dd27e3"), "w" : [ 10, 20 ] }
{ "_id" : ObjectId("55df169ac7913b1f63dd27e4"), "w" : [ 10, 30 ] }
{ "_id" : ObjectId("55df16a3c7913b1f63dd27e5"), "w" : [ 20, 30 ] }
{ "_id" : ObjectId("55df16c1c7913b1f63dd27eb"), "w" : [ 10, 60 ] }
{ "_id" : ObjectId("55df16a6c7913b1f63dd27e6"), "w" : [ 20, 50 ] }
{ "_id" : ObjectId("55df16aac7913b1f63dd27e7"), "w" : [ 50, 50 ] }
{ "_id" : ObjectId("55df16afc7913b1f63dd27e8"), "w" : [ 50, 80 ] }

<2>. $center:圆形,使用{$center:[[<x1>,<y1>],r]}表示

> db.location.find({w:{$geoWithin:{$center:[[10,20],40]}}})
{ "_id" : ObjectId("55df1696c7913b1f63dd27e3"), "w" : [ 10, 20 ] }
{ "_id" : ObjectId("55df169ac7913b1f63dd27e4"), "w" : [ 10, 30 ] }
{ "_id" : ObjectId("55df16a3c7913b1f63dd27e5"), "w" : [ 20, 30 ] }
{ "_id" : ObjectId("55df16c1c7913b1f63dd27eb"), "w" : [ 10, 60 ] }
{ "_id" : ObjectId("55df16a6c7913b1f63dd27e6"), "w" : [ 20, 50 ] }

<3>. $polygon:多边形,使用{$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示

> db.location.find({w:{$geoWithin:{$polygon:[[10,20],[40,30],[90,30]]}}})
{ "_id" : ObjectId("55df1696c7913b1f63dd27e3"), "w" : [ 10, 20 ] }

<4>. geoNear查询:geoNear使用runCommand命令进行使用,如下:

db.runCommand({geoNear:<collection>,

near:[x,y],

minDistance:, (对2d索引无效)

maxDistance:,

num:

...})

> db.runCommand({geoNear:"location",near:[10,20],maxDistance:10,num:2})
{
"results" : [
{
"dis" : 0,
"obj" : {
"_id" : ObjectId("55df1696c7913b1f63dd27e3"),
"w" : [
10,
20
]
}
},
{
"dis" : 10,
"obj" : {
"_id" : ObjectId("55df169ac7913b1f63dd27e4"),
"w" : [
10,
30
]
}
}
],
"stats" : {
"nscanned" : 22,
"objectsLoaded" : 2,
"avgDistance" : 5,
"maxDistance" : 10,
"time" : 4
},
"ok" : 1

# 创建2dsphere索引

创建方式:db.collection.ensureIndex({w:"2dsphere"})

位置表示方式

GeoJSON:描述一个点,一条直线,多边形等形状。

格式:{type:"", coordinates:[<coordinates>]}

查询方式与2d索引方式类似,支持$minDistance与$maxDistance

MongoDB的索引(三)的更多相关文章

  1. 快速掌握mongoDB(三)——mongoDB的索引详解

    1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...

  2. MongoDB数据库索引

    前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查 ...

  3. MongoDB数据库索引构建情况分析

    前面的话 本文将详细介绍MongoDB数据库索引构建情况分析 概述 创建索引可以加快索引相关的查询,但是会增加磁盘空间的消耗,降低写入性能.这时,就需要评判当前索引的构建情况是否合理.有4种方法可以使 ...

  4. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  5. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

  6. 五、MongoDB的索引

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 四.MongoDB的查询 五.MongoDB的索引 1.简介 它就像是一本书的目录,如果没 ...

  7. mongodb数据库索引管理

    1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...

  8. 关于mongodb创建索引的一些经验总结(转)

    查看语句执行计划: explain() 在mongodb3+版本后输出格式发生改变: 详情参见:https://docs.mongodb.com/v3.0/reference/method/curso ...

  9. MongoDB 覆盖索引查询

    MongoDB 覆盖索引查询 官方的MongoDB的文档中说明,覆盖查询是以下的查询: 所有的查询字段是索引的一部分 所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, Mo ...

随机推荐

  1. uC/OS-II信号(OS_sem)块

    /*************************************************************************************************** ...

  2. WinRAR压缩

    WinRAR压缩软件: ------------------ 软件官网:http://www.winrar.com.cn/ -------------------------------

  3. 使用RawSocket进行网络抓包

    aw socket,即原始套接字,可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的,一共可以有3种方式创建这种socket. 中文名 原始套接字 外文名 RAW SOCKET ...

  4. JavaScript学习笔记——BOM_window对象

    javascript浏览器对象模型-windwo对象 BOM Browser Object Model window对象 是BOM中所有对象的核心. 一.属性 1.(位置类型-获得浏览器的位置) IE ...

  5. Hadoop-2.7.3 问题收集

    问题1:在DFS Lcation 上不能多文件进行操作: 在Hadoop上的每个节点上修改该文件       conf/mapred-site.xml 增加: <property> < ...

  6. HTML 个人资料框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Unity Editor开发

    SerializedObject SerializedObject.Update()更新所有序列化对象的值:SerializedObject.ApplyModifiedProperties()应用序列 ...

  8. dedecms标签的sql语句

    {dede:sql sql='Select content from dede_arctype where id=1' titlelen='40′} [field:content/] {/dede:s ...

  9. xcode 不显示占用内存

    解决办法: Scheme设置中,将 Enable Zombie Objects 勾选去掉.

  10. EntityFramework系列:SQLite.CodeFirst自动生成数据库

    http://www.cnblogs.com/easygame/p/4447457.html 在Code First模式下使用SQLite一直存在不能自动生成数据库的问题,使用SQL Server C ...