Mongodb笔记(二) Index
版本:mongodb3.4;
Index :
如果mongodb不能使用索引进行排序,就会将数据放入内存中进行排序,而当内存使用超过32MB时,就会报错。
在创建索引时,应确保索引的选择力,避免多余的查询。避免没有选择力的索引。
_id是默认的索引。
基本方法:
db.collection.createIndex({A:1});
db.collection.dropIndex({A:1}); //两种方法删除。
.dropIndex('indexName');
db.collection.dropIndexes();
db.collection.getIndexes();
db.collection.reIndex(); //重建index
一,Single Indexes单项索引:
{field:1}
二,Compound Indexes复合索引:
{A:1,B:1}
两个field都建立索引。
查询: find ( { A: value}) //使用index;
find( { A:value, B:value}) //使用Index;
find ( { }) .sort({B:1}) // nonuse; 复合索引单独使用一个时,只认第一个(A)。此处使用索引交集,可以成功。
find( { } ).sort ({A:1}) //use
.sort({A:1}) // use;
.sort ({ A:1,B:1}) //use;
.sort ( {A:-1,B:-1}) //use;
.sort({A:-1,B:1}) // nonuse;
三,Multikey Indexes多键索引:
1。:
document: {A: [ 1,2,3] }
index: {A:1}
find ({A:1}) //如此使用该索引;
2。复合索引:
复合索引中只能出现一个多键索引,所以:
index:{A:1,B:1}
insert({ A:[1,2],B:[1,2]}) //error;
insert( {A:[1,2] ,B: 1}) //pass;
3.the array Field contain nested Objects:
document: {A: [ { a:1, b:2}, { a: 3, b: 4}]},
index{ A.a : 1} 通过这样,对其建立索引;
四,Text Index文本索引:
通过正则来匹配文档,是很耗性能的。所以有这么一个text Index;
使用: createIndex({A:'text'}) , 默认是使用英语。
可以通过第二个属性来定义语言: createIndex({A:'text'}, { default_language:'hans'});
hans是简体中文。可惜mongod企业版中才能使用中文的Text Index。
五,Index Intersection索引交集:
比如你有如下索引:
index:{A:1},
index:{B: 1,C:1},
index { B:1}
find ( { A:value , B :value } ) //支持
find ( { A:value } ) .sort ( { B: 1}) //不支持
find ( { B:value} ) .sort ( { C:1}) //支持,使用了 {B:1,C:1}这个索引,虽然有{B:1}这个single Index;
六,Index properties索引属性:
1,TTL(设置document过期时间):
db.test.createIndex( {expire:1} , { expireAfterSeconds:3000} );
建议一个expire的索引,其在document中所接受的值必须为:BSON日期类型。或者Array<BSON>;
插入的document将在其指定的时间+3000S后被删除。
也就是插入时,就得到了这个过期时间。mongodb周期性地,将这个过期时间与目前时间比较,小于等于目前时间时,该数据过期。比如:
db.test.insert ({ expire : new Date()}); 就会在3000S后过期。
接下面的例子:
var time= new Date();
time.setFullYear(time.getFullYear()-1); db.test.update({....},{expire:time}); //将时间改为更早,使得document提前过期;
db.test.update({....},{$currentDate:{expire:true}}) //将时间修正为当前,强行续命!
mongdb里的expire 与Redis中是不一样的。需要多理解。
2,Unique唯一索引:
create( { id:1} , {unique:ture} )
在collection中每个document的id都是唯一,重复者不能写入。
3,Partical局部索引:
create({ name:1}, { age:{$gt:20}});
只对age大于20的document进行索引。与unique连用时,不被索引区不受unique限制。
4,Sparse稀疏索引:
create({name:1},{sparse:true});
不使用时,当有一个及以上document没有name属性时,db.test.distinct('name') 将会返回一个null。因为查询时,遍历了这些文档。
使用稀疏,db.test.distinct('name')。不会查询没有name属性的document。返回应得值。
db.find({}).sort({name:1}) //默认不会使用稀疏索引。所以这里改用强制指定索引:
db.find({}).sort({name:1}).hint({name:1}) //强行使用name Index;
db.find({}).hint({$natural:1}) //禁用一切索引进行查询
在replSet上创建索引:
https://docs.mongodb.com/manual/tutorial/build-indexes-on-replica-sets/
Mongodb笔记(二) Index的更多相关文章
- MongoDB学习笔记二- Mongoose
MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Elasticsearch笔记二之Curl工具基本操作
Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- Django开发笔记二
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- webpack笔记二 管理资源
webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...
随机推荐
- Java 语言基础之数组(一)
数组定义及格式: 数组: 同一种类型数据的集合, 就是一个容器 定义数组格式1: 元素类型[] 数组名 = new 元素类型[元素个数(即数组长度)]; 说明: 数组是一个容器.而容器属于一个实体,实 ...
- XML 解析之 jaxp 解析器
XML 的解析方式有两种方式: DOM 解析和 SAX 解析. DOM 解析: 根据 XML 的层级结构, 在内存中分配一个树形结构, 把 XML 的标签, 属性和文本都封装成对象. 优点: 可以实现 ...
- settings配置与model优化
settings配置与model优化 settings: 项目基本配置(settings.py, models.py, admin.py, templates...).数据库操作.中间件 http: ...
- Android—Http连接之GET/POST请求
在Android SDK中提供了Apache HttpClient(org.apache.http.*)模块.在这个模块中涉及到两个重要的类:HttpGet和HttpPost. 创建步骤: ...
- flask实现获取表单并执行shell
1.一个HTML form input和一个button提供给用户输入 2.使用flask的request获取用户输入的文件名 3.判断输入异常 4.执行shell命令touch aa.txt 并返回 ...
- Hive学习路线图--张丹老师
前言 Hive是Hadoop家族中一款数据仓库产品,Hive最大的特点就是提供了类SQL的语法,封装了底层的MapReduce过程,让有SQL基础的业务人员,也可以直接利用Hadoop进行大数据的操作 ...
- 解释一下python中的身份运算符
通过身份运算符‘is’和‘is not’,我们可以确定两个值是否相同 ')#False print(True is not False)#True
- UVALive 6911 F - Double Swords
思路:1.把所有有长度的剑看做点.Ai点是肯定要取.然后求另一把剑. 先对右区间排个序,然后每次看这个区间范围内有没有剑,如果没有就添加一把(值为右端点的剑): 如果有并且数量为1且这条龙的Ai等这把 ...
- HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)
这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...
- Python面试题之Python和Java中Super方法的区别
python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...