文档章节

mongoDB 索引管理

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 1897
阅读 15
收藏 0
点赞 0
评论 0

1.单列索引
在字段x上创建索引,1 (ascending) or -1 (descending) 1表示升序(asc),-1表示降序(desc)
> db.data.ensureIndex({x:1})


显示表data里面的所有索引
> db.data.getIndexes()
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        }
]


查找字段x为6的值,此时已经用到索引了
> db.data.find({x:6})
{ "_id" : ObjectId("4bee804ba23d558eb6687117"), "x" : 6, "name" : "caihuafeng1" }


2.默认索引
上述1中db.data.getIndexes()显示出来的一共有2个索引,其中_id是创建表的时候自动创 建的索引,此索引是不能够删除的。

 

3.文档作为索引的键值
a.单列索引
MongoDB的官方文档上面是这样说的:
Documents as Keys


Indexed fields may be of any type, including documents:


往数据库recommender的表data中插入三条记录
> db.data.insert({name:"1616",info:{url:"
http://www.1616.net/",city:"beijing "}});
> db.data.insert({name:"hao123",info:{url:"
http://www.hao123.com/",city:"beijing "}});
> db.data.insert({name:"ll4la",info:{url:"
http://www.114la.com/",city:"dongguan "}});


对字段info创建索引
> db.data.ensureIndex({info: 1});


显示表data上的所有索引
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        }
]
查找指定的记录,此时会用到索引
> db.data.find({info: {url:"
http://www.1616.net/",city:"beijing "}});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


b.组合索引
建立组合索引
> db.data.ensureIndex({"info.url":1, "info.city":1});
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        },
        {
                "_id" : ObjectId("4befb9d1b0e29ba1ce20e0c0"),
                "ns" : "recommender.data",
                "key" : {
                        "info.url" : 1,
                        "info.city" : 1
                },
                "name" : "info.url_1_info.city_1"
        }
]


下面几个操作均会用到索引
> db.data.find({"info.url": "
http://www.1616.net/ ", "info.city": "beijing"});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


> db.data.find({"info.url": " http://www.1616.net/ "});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }


1表示升序(asc),-1表示降序(desc)
> db.data.find({"info.url": /http:*/i}).sort({"info.url": 1, "info.city": 1});
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }


> db.data.find({"info.url": /http:*/i}).sort({"info.url": 1});
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }


> db.data.find({"info.url": /http:*/i}).sort({"info.url": -1});
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }


4.组合索引
注意,这里的组合索引与上述3中的b中的组合索引是有点不同的,4里面是对一 级字段建立组合索引,而上述3中是对二级字段建立组合索引。


在字段name及info上面创建组合索引
> db.data.ensureIndex({name: 1, info: -1});


当创建组合索引时,字段后面的1表示升序,-1表示降序,是用1还是用-1主要是跟排序的时候或指定范围内查询 的时候有关的,具体看下面的英文原文的说明。
When creating an index, the number associated with a key specifies the direction of the index, so it should always be 1 (ascending) or -1 (descending). Direction doesn't matter for single key indexes or for random access retrieval but is important if you are doing sorts or range queries on compound indexes.


显示所有的索引
> db.data.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.data",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befb146b0e29ba1ce20e0bb"),
                "ns" : "recommender.data",
                "key" : {
                        "x" : 1
                },
                "name" : "x_1"
        },
        {
                "_id" : ObjectId("4befb76bb0e29ba1ce20e0bf"),
                "ns" : "recommender.data",
                "key" : {
                        "info" : 1
                },
                "name" : "info_1"
        },
        {
                "_id" : ObjectId("4befb9d1b0e29ba1ce20e0c0"),
                "ns" : "recommender.data",
                "key" : {
                        "info.url" : 1,
                        "info.city" : 1
                },
                "name" : "info.url_1_info.city_1"
        },
        {
                "_id" : ObjectId("4befbfcfb0e29ba1ce20e0c1"),
                "ns" : "recommender.data",
                "key" : {
                        "name" : 1,
                        "info" : -1
                },
                "name" : "name_1_info_-1"
        }
]


下面的排序将用到上面的索引
最后一行的"name" : "ll4la"实际上是"name" : "114la"(就是将数字一写成了字母l),但是我录入的时候写成了"name" : "ll4la",是我写错了,但是排序的结果是对的。
> db.data.find({"info.url": /http:*/i}).sort({name:1, info: -1});
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }


MongoDB组合索引规则
If you have a compound index on multiple fields, you can use it to query on the beginning subset of fields. So if you have an index on


a,b,c


you can use it query on


a


a,b


a,b,c


如果用过MySQL的话,看起来是不是很熟悉,原理跟MySQL是一样的。


5.唯一索引
往表data中插入一条记录。
> db.data.insert({firstname: "cai", lastname: "huafeng"});


由于表data中只有一记录有字段firstname及lastname,其它的行均没有相应的值,也就是均为 null,为null就说明是相同的,而唯一索引是不允许有相同的值的,所以下面创建唯一组合索引时报错了。


所以建立唯一索引时,不管是对单个字段还是多个字段建立索引,则最好每一行均有此字段,否则会报错。


> db.data.find();
{ "_id" : ObjectId("4bee745a0863b1c233b8b7ea"), "name" : "caihuafeng" }
{ "_id" : ObjectId("4bee745f0863b1c233b8b7eb"), "website" : "1616.net" }
{ "_id" : ObjectId("4bee804ba23d558eb6687117"), "x" : 6, "name" : "caihuafeng1" }
{ "_id" : ObjectId("4bee804ba23d558eb6687118"), "x" : 6, "name" : "caihuafeng2" }
{ "_id" : ObjectId("4bee804ba23d558eb6687119"), "x" : 6, "name" : "caihuafeng3" }
{ "_id" : ObjectId("4bee804ba23d558eb668711a"), "x" : 6, "name" : "caihuafeng4" }
{ "_id" : ObjectId("4bee804ba23d558eb668711b"), "x" : 6, "name" : "caihuafeng5" }
{ "_id" : ObjectId("4bee804ba23d558eb668711c"), "x" : 6, "name" : "caihuafeng6" }
{ "_id" : ObjectId("4bee804ba23d558eb668711d"), "x" : 6, "name" : "caihuafeng7" }
{ "_id" : ObjectId("4bee804ba23d558eb668711e"), "x" : 6, "name" : "caihuafeng8" }
{ "_id" : ObjectId("4bee804ba23d558eb668711f"), "x" : 6, "name" : "caihuafeng9" }
{ "_id" : ObjectId("4bee804ba23d558eb6687120"), "x" : 6, "name" : "caihuafeng10" }
{ "_id" : ObjectId("4befb711b0e29ba1ce20e0bc"), "name" : "1616", "info" : { "url" : "
http://www.1616.net/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb723b0e29ba1ce20e0bd"), "name" : "hao123", "info" : { "url" : "
http://www.hao123.com/ ", "city" : "beijing" } }
{ "_id" : ObjectId("4befb740b0e29ba1ce20e0be"), "name" : "ll4la", "info" : { "url" : "
http://www.114la.com/ ", "city" : "dongguan" } }
{ "_id" : ObjectId("4befc51ab0e29ba1ce20e0c2"), "firstname" : "cai", "lastname" : "huafeng" }


> db.data.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
E11000 duplicate key error index: recommender.data.$firstname_1_lastname_1  dup key: { : null, : null }


下面我们用另外一个表person来进行测试
> db.person.ensureIndex({firstname:1, lastname: 1},{unique: true});
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});


第二次插入同样值的时候报错了,说明唯一索引生效了,其实跟MySQL里面是一样的。
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }


6.唯一索引中的重复值处理
删除上述5中的索引,插入两行一样的记录


> db.person.dropIndexes();
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }
> db.person.insert({firstname: 'cai', lastname: 'huafeng'});
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }
{ "_id" : ObjectId("4befcef0b0e29ba1ce20e0d1"), "firstname" : "cai", "lastname" : "huafeng" }


如果现在直接在字段firstname及lastname上面创建唯一组合索 引的时候肯定会报错,我们来试一试:
> db.person.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }


查看表person的索引,我们可以看到,新创建的索引没有生成。
> db.person.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.person",
                "key" : {
                        "_id" : 1
                }
        }
]


可以在第二个json对象加入一项dropDups: true,这样在创建唯一组合索引的时候不会报错,保留文档中第一个重复的值,其它重复的值均删除。


再次测试一下,加入dropDups选项,虽然报错了,但是唯一组合索引已经建立了。
> db.person.ensureIndex({firstname: 1, lastname: 1}, {unique: true, dropDups: true});
E11000 duplicate key error index: recommender.person.$firstname_1_lastname_1  dup key: { : "cai", : "huafeng" }
> db.person.getIndexes();
[
        {
                "name" : "_id_",
                "ns" : "recommender.person",
                "key" : {
                        "_id" : 1
                }
        },
        {
                "_id" : ObjectId("4befcfd9b0e29ba1ce20e0d3"),
                "ns" : "recommender.person",
                "key" : {
                        "firstname" : 1,
                        "lastname" : 1
                },
                "name" : "firstname_1_lastname_1",
                "unique" : true,
                "dropDups" : true
        }
]


再次查询表person中的记录,发现重复的记录已经自动删除了。
> db.person.find();
{ "_id" : ObjectId("4befcda6b0e29ba1ce20e0cf"), "firstname" : "cai", "lastname" : "huafeng" }


MongoDB官方文档的说明
A unique index cannot be created on a key that has duplicate values. If you would like to create the index anyway, keeping the first document the database indexes and deleting all subsequent documents that have duplicate values, add the dropDups option.


db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})

 


7.删除索引
a.删除某个表中的所有索引
To delete all indexes on the specified collection:


    db.collection.dropIndexes();


b.删除某个表中的单一索引
To delete a single index:


    db.collection.dropIndex({x: 1, y: -1})

 


> db.data.dropIndex({firstname: 1, lastname: 1});
{ "nIndexesWas" : 6, "ok" : 1 }


Running directly as a command without helper:


// note: command was "deleteIndexes", not "dropIndexes", before MongoDB v1.3.2
// remove index with key pattern {y:1} from collection foo
db.runCommand({dropIndexes:'foo', index : {y:1}})
// remove all indexes:
db.runCommand({dropIndexes:'foo', index : '*'})


> db.person.ensureIndex({firstname: 1, lastname: 1});


> db.runCommand({dropIndexes:'person', index:{firstname:1, lastname:1}});
{ "nIndexesWas" : 2, "ok" : 1 }

 

 

转载自:http://blog.sina.com.cn/s/blog_5e0d59fb0100qscl.html

本文转载自:http://zuoqiang.iteye.com/blog/1175131

共有 人打赏支持
ruyees
粉丝 3
博文 71
码字总数 0
作品 0
深圳
产品经理
mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、等等)

最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的...

Airship ⋅ 06/01 ⋅ 0

MongoDB 3.0新特性概述

MongoDB 在 2015年3月3日 跳过了 MongoDB 2.8版本,直接在 MongoDB 2.6版本后,发布了MongoDB 3.0版本。 随后在 2015年3月17日 发布了 MongoDB 3.0.1 版本; 在 2015年4月9日发布了 MongoDB ...

xinsir999 ⋅ 05/02 ⋅ 0

大数据分析挖掘学习方向?数据分析师的就业前景怎么样?

加米谷数据分析挖掘课程明细,从理论到云端实操环境到项目实战,手把手教您从0掌握数据分析与挖掘技术,带您走进数据时代。 第一阶段(python基础) python入门:1、Python版本特性介绍2、P...

加米谷大数据 ⋅ 04/17 ⋅ 0

MongoDB 用户名密码登录

Mongodb enable authentication MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意Mongodb 端口(默认 27017)的开放状态,那么Mongodb就会产生安全风险,被利用此配...

kimoCHG ⋅ 2017/01/07 ⋅ 0

MongoDB索引类型-基础索引、复合索引、文档索引、唯一索引

与关系型数据库一样,合理的使用索引可以大幅提高MongoDB的查询效率,本文介绍基础索引、复合索引、文档索引等几种常用索引的使用。 基础索引与复合索引 1.1 基础索引 1.2 组合索引 文档索引...

Airship ⋅ 06/01 ⋅ 0

MongoDB · 引擎特性 · journal 与 oplog,究竟谁先写入?

MongoDB journal 与 oplog,谁先写入?最近经常被人问到,本文主要科普一下 MongoDB 里 oplog 以及 journal 这两个概念。 journal journal 是 MongoDB 存储引擎层的概念,目前 MongoDB主要支...

db匠 ⋅ 05/22 ⋅ 0

Centos7下安装mongodb

MongoDB由C++语言编写,是一个基于分布式文件存储的数据库,目的在于为web应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功...

goldfishe ⋅ 05/07 ⋅ 0

Mac和Ubuntu18.04下MongoDB的安装

Mac安装mongodb 使用安装 从默认的配置文件启动mongodb 安装完成后,MongoDB服务启动、停止、重启命令如下: Mac下的mongodb可视化管理工具,推荐使用开源免费的, 下载地址:https://robomon...

翌日千里 ⋅ 05/26 ⋅ 0

京东、阿里大型互联网必备B2C商城项目实战

B2C商城项目实战 撸起袖子干实事,项目经验那点事 系统设计 架构设计 数据库设计 部署设计 基础开发框架讲解 用户管理子系统 用户注册登录(二维码技术) 权限控制(shiro) 单点登录(sessi...

Java高级架构 ⋅ 04/16 ⋅ 0

安装配置MongoDB3.6.3数据库以及启动脚本

linxu上安装mongodb3.6实战 根据linux 版本到官网下载对应mongodb版本 下载 https://fastdl.mongodb.org/linux/mongodb-linux-x8664-3.6.3.tgz 查看服务器版本:cat /proc/version 查看linux...

秦时明月路 ⋅ 06/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部