MongoDB 常见的查询索引
常见的查询索引
_id索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
> db.jerome_2.collection.insert({x:2})WriteResult({ "nInserted" : 1 })> db.jerome_2.collection.getIndexes()[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "jerome.jerome_2.collection" }]> db.jerome_2.collection.findOne(){ "_id" : ObjectId("557004f1f2824fa15224e20b"), "x" : 2 }> |
单键索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
> db.jerome_2.collection.ensureIndex({x:1}) # 创建单键索引{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1}> db.jerome_2.collection.getIndexes()[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "jerome.jerome_2.collection" }, { "v" : 1, "key" : { "x" : 1 }, "name" : "x_1", "ns" : "jerome.jerome_2.collection" }]> db.jerome_2.collection.find({x:1}) #使用创建的索引查询{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }> |
多键索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
> db.jerome_2.collection.getIndexes()[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "jerome.jerome_2.collection" }, { "v" : 1, "key" : { "x" : 1 }, "name" : "x_1", "ns" : "jerome.jerome_2.collection" }]> db.jerome_2.collection.find(){ "_id" : ObjectId("557004f1f2824fa15224e20b"), "x" : 2 }{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }> db.jeroem_2.collection.insert({x:[1,2,3,4,5]}) #插入一条数组数据,对于这条数据来讲。mongodb为其创建了一个多键索引WriteResult({ "nInserted" : 1 }) |
复合索引
|
1
2
3
4
5
6
7
8
9
10
|
> db.jerome_2.collection.ensureIndex({x:1,y:1}) #创建{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1}> db.jerome_2.collection.find({x:1,y:2}) #使用{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }> |
过期索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
> db.jerome_2.collection.ensureIndex({time:1},{expireAfterSeconds:30}) #创建过期索引,过期时间30秒{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 3, "numIndexesAfter" : 4, "ok" : 1}> db.jerome_2.collection.insert({time:new Date()}) #插入数据測试WriteResult({ "nInserted" : 1 })> db.jerome_2.collection.find(){ "_id" : ObjectId("557004f1f2824fa15224e20b"), "x" : 2 }{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }{ "_id" : ObjectId("55700b17f2824fa15224e20e"), "time" : ISODate("2015-06-04T08:23:51.531Z") }> db.jerome_2.collection.find(){ "_id" : ObjectId("557004f1f2824fa15224e20b"), "x" : 2 }{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }{ "_id" : ObjectId("55700b17f2824fa15224e20e"), "time" : ISODate("2015-06-04T08:23:51.531Z") }> db.jerome_2.collection.find() #时间过了就找不到了{ "_id" : ObjectId("557004f1f2824fa15224e20b"), "x" : 2 }{ "_id" : ObjectId("557005a5f2824fa15224e20c"), "x" : 1, "y" : 2, "z" : 3 }> |
(必须是ISODate或者ISODate数组,不能使用时间戳。否则不能被自己主动删除)
全文索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
> db.jerome_2.ensureIndex({"article":"text"}) #创建全文可搜索索引{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1}> db.jerome_2.insert({"article":"aa bb cc dd ee"}) #插入測试数据WriteResult({ "nInserted" : 1 })> db.jerome_2.insert({"article":"aa bb rr gg zz"})WriteResult({ "nInserted" : 1 })> db.jerome_2.insert({"article":"aa bb"})WriteResult({ "nInserted" : 1 })> db.jerome_2.insert({"article":"aa bb cc zz ff ww"})WriteResult({ "nInserted" : 1 })> db.jerome_2.find({$text:{$search:"aa"}}) #查找{ "_id" : ObjectId("5572904271c0bbd90f4ce0e2"), "article" : "aa bb rr gg zz" }{ "_id" : ObjectId("5572903371c0bbd90f4ce0e1"), "article" : "aa bb cc dd ee" }{ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww" }{ "_id" : ObjectId("5572904771c0bbd90f4ce0e3"), "article" : "aa bb" }> db.jerome_2.find({$text:{$search:"ff"}}){ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww" }> db.jerome_2.find({$text:{$search:"aa bb cc"}}) #空格表示或{ "_id" : ObjectId("5572904271c0bbd90f4ce0e2"), "article" : "aa bb rr gg zz" }{ "_id" : ObjectId("5572903371c0bbd90f4ce0e1"), "article" : "aa bb cc dd ee" }{ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww" }{ "_id" : ObjectId("5572904771c0bbd90f4ce0e3"), "article" : "aa bb" }> db.jerome_2.find({$text:{$search:"aa bb -cc"}}) #-cc 表示不包括cc{ "_id" : ObjectId("5572904271c0bbd90f4ce0e2"), "article" : "aa bb rr gg zz" }{ "_id" : ObjectId("5572904771c0bbd90f4ce0e3"), "article" : "aa bb" }> db.jerome_2.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}}) #加引號,表示与{ "_id" : ObjectId("5572903371c0bbd90f4ce0e1"), "article" : "aa bb cc dd ee" }{ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww" }> |
|
1
2
3
4
5
6
7
8
9
10
11
|
> db.jerome_2.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}) #score越高,类似度越高。{ "_id" : ObjectId("5572904271c0bbd90f4ce0e2"), "article" : "aa bb rr gg zz", "score" : 1.2 }{ "_id" : ObjectId("5572903371c0bbd90f4ce0e1"), "article" : "aa bb cc dd ee", "score" : 1.2 }{ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww", "score" : 1.1666666666666667 }{ "_id" : ObjectId("5572904771c0bbd90f4ce0e3"), "article" : "aa bb", "score" : 1.5 }> db.jerome_2.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) #依据score进行排序{ "_id" : ObjectId("5572904771c0bbd90f4ce0e3"), "article" : "aa bb", "score" : 1.5 }{ "_id" : ObjectId("5572903371c0bbd90f4ce0e1"), "article" : "aa bb cc dd ee", "score" : 1.2 }{ "_id" : ObjectId("5572904271c0bbd90f4ce0e2"), "article" : "aa bb rr gg zz", "score" : 1.2 }{ "_id" : ObjectId("5572905671c0bbd90f4ce0e4"), "article" : "aa bb cc zz ff ww", "score" : 1.1666666666666667 }> |
地理位置索引
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
> db.location.ensureIndex({"w":"2d"}) #创建2d索引> db.location.insert({w:[1,1]}) #插入測试数据。经纬度[经度,纬度]。
WriteResult({ "nInserted" : 1 })> db.location.insert({w:[1,2]})WriteResult({ "nInserted" : 1 })> db.location.insert({w:[2,3]})WriteResult({ "nInserted" : 1 })> db.location.insert({w:[100,80]})WriteResult({ "nInserted" : 1 })> db.location.find({w:{$near:[1,1]}}) #查询距离某个点近期的点{ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }{ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a97aaba41684d6e8826f"), "w" : [ 100, 80 ] }> db.location.find({w:{$near:[1,1],$maxDistance:2}}) #能够使用maxDistance限制(near不能使用minDistance){ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] } |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
> db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}}) #矩形{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }{ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }> db.location.find({w:{$geoWithin:{$box:[[1,2],[2,3]]}}}){ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }{ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }> db.location.find({w:{$geoWithin:{$center:[[0,0],100]}}}) #圆形。100是半径{ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }> db.location.find({w:{$geoWithin:{$center:[[0,0],1000]}}}){ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a97aaba41684d6e8826f"), "w" : [ 100, 80 ] }{ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }> db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}}) #多边形查询(各个点围成的多边形的范围){ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] }> db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1000],[1001,0]]}}}){ "_id" : ObjectId("5572a970aba41684d6e8826e"), "w" : [ 2, 3 ] }{ "_id" : ObjectId("5572a97aaba41684d6e8826f"), "w" : [ 100, 80 ] }{ "_id" : ObjectId("5572a961aba41684d6e8826c"), "w" : [ 1, 1 ] }{ "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] } |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
> db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1}){ "results" : [ { "dis" : 0, "obj" : { "_id" : ObjectId("5572a965aba41684d6e8826d"), "w" : [ 1, 2 ] } } ], "stats" : { "nscanned" : NumberLong(1), "objectsLoaded" : NumberLong(1), "avgDistance" : 0, "maxDistance" : 0, "time" : 2 }, "ok" : 1}> |
创建索引比較重要属性介绍
1. 名字,name指定:db.collection.ensureIndex({},{name:""})
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
> db.jerome_2.ensureIndex({x:1})> db.jerome_2.ensureIndex({y:-1})> db.jerome_2.getIndexes()[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "jerome.jerome_2" }, { "v" : 1, "key" : { "x" : 1 }, "name" : "x_1", "ns" : "jerome.jerome_2" }, { "v" : 1, "key" : { "y" : -1 }, "name" : "y_-1", "ns" : "jerome.jerome_2" } |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
> db.jerome_2.ensureIndex({x:1,y:-1})> db.jerome_2.ensureIndex({x:1,y:-1,z:1})> db.jerome_2.getIndexes()[ { "v" : 1, "key" : { "x" : 1, "y" : -1 }, "name" : "x_1_y_-1", "ns" : "jerome.jerome_2" }, { "v" : 1, "key" : { "x" : 1, "y" : -1, "z" : 1 }, "name" : "x_1_y_-1_z_1", "ns" : "jerome.jerome_2" }] |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
> db.jerome_2.ensureIndex({x:1,y:1,z:1,m:1},{name:"normal_index"})> db.jerome_2.getIndexes()[ { "v" : 1, "key" : { "x" : 1, "y" : 1, "z" : 1, "m" : 1 }, "name" : "normal_index", "ns" : "jerome.jerome_2" }]> db.jerome_2.dropIndex("normal_index"){ "nIndexesWas" : 7, "ok" : 1 }> |
2. 唯一性。unique 指定:db.collection.ensureIndex({},{unique:true/false})
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
> db.jerome.ensureIndex({m:1,n:1},{unique:true}){ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1}> db.jerome.insert({m:1,n:2})WriteResult({ "nInserted" : 1 })> db.jerome.insert({m:1,n:2})WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: jerome.jerome.$m_1_n_1 dup key: { : 1.0, : 2.0 }" }})> |
3. 稀疏性,sparse 指定:db.collection.ensureIndex({},{sparse:true/false})
由于 MongoDB 没有固定的格式,插入的时候可能插入不存在的字段。比方x:1,MongoDB 会为这条不存在的字段创建索引。假设不希望发现这种事情能够指定稀疏索引为 true,就不会为不存在的字段创建索引了。
能够降低磁盘占用和增大插入速度。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
> db.jerome.insert({"m":1})WriteResult({ "nInserted" : 1 })> db.jerome.insert({"n":1})WriteResult({ "nInserted" : 1 })> db.jerome.find({m:{$exists:true}}) #exists查找数据集合中一个字段存在或者不存在的记录{ "_id" : ObjectId("55729ec1aba41684d6e8826a"), "m" : 1 }{ "_id" : ObjectId("55729d5caba41684d6e88268"), "m" : 1, "n" : 2 }> db.jerome.ensureIndex({m:1},{sparse:true}) #创建稀疏索引{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1}> db.jerome.find({m:{$exists:false}}) #MongoDB内部问题。所以找得到,通过以下强制指定索引{ "_id" : ObjectId("55729ec7aba41684d6e8826b"), "n" : 1 }> db.jerome.find({m:{$exists:false}}).hint("m_1") #以下这条记录。不存在m字段,所以不会创建索引。所以查不到记录 > |
4. 是否定时删除
MongoDB 常见的查询索引的更多相关文章
- mongoDB常见的查询索引(三)
1. _id索引 _id索引是绝大多数集合默认建立的索引 对于每个插入的数据,MongoDB会自动生成一条唯一的_id字段. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- Mongodb 常见的查询语句及与 mysql 对比
db.users.find()select * from users db.users.find({"age" : 27})select * from users where ag ...
- spring Mongodb查询索引报错 java.lang.NumberFormatException: empty String
最近事情比较多,本篇文章算是把遇到的问题杂糅到一起了. 背景:笔者最近在写一个mongo查询小程序,由于建立索引时字段名用大写,而查询的时候用小写. 代码如下: db.getCollection(&q ...
- java mongodb 基础系列---查询,排序,limit,$in,$or,输出为list,创建索引,$ne 非操作
官方api教程:http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/#getting-started ...
- Mongodb 笔记03 查询、索引
查询 1. MongoDB使用find来进行查询.find的第一个参数决定了要返回哪些文档,这个参数是一个文档,用于指定查询条件.空的查询会匹配集合的全部内容.要是不指定查询,默认是{}. 2. 可以 ...
- MongoDB优化,建立索引实例及索引机制原理讲解
MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...
- mongodb 高级聚合查询
mongodb高级聚合查询 在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysq ...
- Mysql常见四种索引的使用
提到MySQL优化,索引优化是必不可少的.其中一种优化方式 --索引优化,添加合适的索引能够让项目的并发能力和抗压能力得到明显的提升. 我们知道项目性能的瓶颈主要是在"查(select)&q ...
- 【mongoDB中级篇②】索引与expain
索引的操作 数据库百分之八十的工作基本上都是查询,而索引能帮我们更快的查询到想要的数据.但是其降低了数据的写入速度,所以要权衡常用的查询字段,不必在太多字段上建立索引. 在mongoDB中默认是用bt ...
随机推荐
- 使用Sublime Text 3 编写python
1,下载Sublime Text 3 链接:http://pan.baidu.com/s/1eROBpB0 密码:cqjr 2,安装 注意安装时去掉捆绑的软件安装选项,有两处. 3,安装完成打开软件, ...
- 【转载】无需图片,使用CSS3实现圆角按钮
原文地址:http://www.open-open.com/home/space-37924-do-blog-id-5789.html 首先来看看效果: 事例HTML代码: <a href=&q ...
- [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性
1018: [SHOI2008]堵塞的交通traffic Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3795 Solved: 1253 [Sub ...
- HDU 6299.Balanced Sequence-贪心、前缀和排序 (2018 Multi-University Training Contest 1 1002)
HDU6299.Balanced Sequence 这个题就是将括号处理一下,先把串里能匹配上的先计数去掉,然后统计左半边括号的前缀和以及右半边括号的前缀和,然后结构体排序,然后遍历一遍,贪心策略走一 ...
- 洛谷 P1049 装箱问题【正难则反/01背包】
题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余 ...
- 腾讯消消乐 (状态压缩DP)
腾讯消消乐 题意 给出长度为 n 的序列,每次可以选择删除序列的一个连续区间,要求这一段区间内所有数最大公约数不小于 k ,删除后剩下的序列仍然构成连续序列. 定义 f(i) 为进行 i 次操作将整个 ...
- 洛谷——P1991 无线通讯网
P1991 无线通讯网 题目描述 国防部计划用无线网络连接若干个边防哨所.2 种不同的通讯技术用来搭建无线网络: 每个边防哨所都要配备无线电收发器:有一些哨所还可以增配卫星电话. 任意两个配备了一条卫 ...
- 10.28 HTML DOM
- apache和tomcat群集
httpd.conf httpd.conf中添加: #与tomcat的插件 include "D:\clusterServer\apache\conf\mod_jk.con ...
- BZOJ 2669- [cqoi2012]局部极小值
不错的题啊 挺好的结合了容斥和状压DP 保证每个数各不相同,又有大小关系,那么就可以将数字从小到大填. 不难发现 局部极小值<=8,这个可以状压,f[i][j] 表示填了前i个数,局部极小值被填 ...