准备工作

继续连接到mongo

C:\Users\zouqi>mongo
MongoDB shell version: 3.0.7
connecting to: test

查看数据库和集合

> show dbs
demo 0.078GB
local 0.078GB
myDatabase 0.078GB
myTest 0.078GB
> use myTest
switched to db myTest
> show collections
persons
system.indexes

创建简单索引

数据准备,在CMD命令窗口中输入如下初始化脚本:

for(var i=0;i<200000;i++){db.books.insert({number:i,name:"book"+i})}

1、先检查一下查询性能

执行如下脚本:
var start=new Date()
db.books.find({number:20540})
var end=new Date()
end - start

> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }
> var start=new Date()
> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }
> var end=new Date()
> end - start
110

2、为number创建索引

(1代表升序,-1代表降序),在创建索引的时候,由于数据量比较大,会比较耗时,我们会看到执行创建索引脚本的时候,光标会有一定的延时。

> db.books.ensureIndex({number:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>

3、再执行第一步的代码可以看出有数量级的性能提升

> var start=new Date()
> db.books.find({number:20540})
{ "_id" : ObjectId("5953c63a797216100b773acb"), "number" : 20540, "name" : "book20540" }
> var end=new Date()
> end - start
15
>

之前耗时是110毫秒,创建索引号耗时是15毫秒。

索引使用需要注意的地方

  1. 创建索引的时候要注意后面参数:1是正序 -1是倒序
  2. 索引的创建在提高查询性能的同时会影响插入的性能,对于经常查询少插入的文档可以考虑用索引。
  3. 组合索引要注意索引的先后顺序
  4. 每个键都创建索引不一定就能够提高性能
  5. 在做排序工作的时候,如果是超大数据量也是可以考虑加上索引用来提高排序的性能。

索引的名称可以用MongoVUE来查看


创建索引的同时我们还可以指定索引的名字
db.booksensureIndex({name:1},{name:"bookname")

4、唯一索引

如何解决文档books不能插入重复的数值?建立唯一索引

db.books.ensureIndex({name:-1},{unique:true})

测试:db.books.insert({name:"hello"})

运行结果如下:

> db.books.insert({name:"hello"})
WriteResult({ "nInserted" : 1 })
> db.books.insert({name:"hello"})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error index: myTest.books.$name_-1 dup key: { : \"hello\" }"
}
})
>

5、删除重复值

如果创建唯一索引之前已经存在重复数值该如何处理

db.books.ensureIndex({name:-1},{unique:true,dropDups:true})

6.Hint

如何强制查询使用指定的索引?

db.books.find({name:"hello",number:1}).hint({name:-1})

注意:指定索引必须是已经创建了的索引

7、Expain

如何详细查看本次查询使用哪个索引和查询数据的状态信息
db.books.find({name:"hello"}).explain()

> db.books.find({name:"hello"}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "myTest.books",
"indexFilterSet" : false,
"parsedQuery" : {
"name" : {
"$eq" : "hello"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"name" : 1
},
"indexName" : "bookname",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"name" : [
"[\"hello\", \"hello\"]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"name" : -1
},
"indexName" : "name_-1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"name" : [
"[\"hello\", \"hello\"]"
]
}
}
}
]
},
"serverInfo" : {
"host" : "DESKTOP-V7CFIC3",
"port" : 27017,
"version" : "3.0.7",
"gitVersion" : "6ce7cbe8c6b899552dadd907604559806aa2e9bd"
},
"ok" : 1
}

索引管理

1、system.indexes

在shell查看数据库中已经建立的索引
db.system.indexes.find()

> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "number" : 1 }, "name" : "number_1", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "name" : 1 }, "name" : "bookname", "ns" : "myTest.books" }
{ "v" : 1, "unique" : true, "key" : { "name" : -1 }, "name" : "name_-1", "ns" : "myTest.books" }
>

db.system.namespaces.find()

> db.system.namespaces.find()
{ "name" : "myTest.system.indexes" }
{ "name" : "myTest.persons" }
{ "name" : "myTest.persons.$_id_" }
{ "name" : "myTest.books" }
{ "name" : "myTest.books.$_id_" }
{ "name" : "myTest.books.$number_1" }
{ "name" : "myTest.books.$bookname" }
{ "name" : "myTest.books.$name_-1" }
>

2、后台执行

执行创建索引的过程中会暂时锁表,此问题如何解决?
为了不影响查询,我们可以让索引的创建过程在后台执行
db.books.ensureIndex({number:1},{background:true})

3、删除索引

批量和精确删除索引
db.runCommand({dropIndexes:"books",index:"name_-1"})

> db.runCommand({dropIndexes:"books",index:"name_-1"})
{ "nIndexesWas" : 4, "ok" : 1 }
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "number" : 1 }, "name" : "number_1", "ns" : "myTest.books" }
{ "v" : 1, "key" : { "name" : 1 }, "name" : "bookname", "ns" : "myTest.books" }
>

db.runCommand({dropIndexes:"books",index:"*"})

> db.runCommand({dropIndexes:"books",index:"*"})
{
"nIndexesWas" : 3,
"msg" : "non-_id indexes dropped for collection",
"ok" : 1
}
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" }
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.books" }
>

Count&Distinct&Group

1、Count

请查询persons中美国学生的人数
db.persons.find({country:"USA"}).count()

2、Distinct

请查询出persons中一共有多少个国家分别是什么
db.runCommand({distinct:"persons",key:"country"}).values

3、Group

语法:
db.runCommand({group:{
ns:集合名称,
Key:分组的键对象,
Initial:初始化累加器,
$reduce:组分解器,
Condition:条件,
Finalize:组玩传奇
}})
分组首先会按照key进行分组,每组的每一个文档都要执行$reduce的方法,它接收2个参数,一个是组内本条记录,一个是累加器数据。
请查出persons中每隔国家学生数学成绩最好的学生信息(必须在90分以上)

db.runCommand({group:{
ns:"persons",
key:{"country":true},
initial:{m:0},
$reduce:function(doc,prev){
if(doc.m>prev.m){
prev.m=doc.m;
prev.name=doc.name;
prev.country=doc.country;
}
},
condition:{m:{$gt:90}}
}})

在上面实例的基础之上把每个人的信息连接起来写一个描述赋值到m上
finalize:function(prev){
prev.m=prev.name+"Math scores"+prev.m
}

数据库命令操作

1、用命令执行一次删除表操作

db.runCommand({drop:"map"})

2、如何查询mongoDB为我们提供额命令

db.listCommands()

3、常用命令举例
查询服务器版本号和主机操作系统

db.runCommand({buildInfo:1})

查询执行集合的详细信息,大小、空间、索引等

db.runCommand({collStats:"persons"})

查看操作本集合最后一次错误信息

db.runCommand({getLastError:"persons"})

每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作的更多相关文章

  1. 每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作

    上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...

  2. 每篇半小时1天入门MongoDB——1. MongoDB介绍和安装

    目录:ASP.NET MVC企业级实战目录 MongoDB简介 MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据 ...

  3. 每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解

    本篇主要介绍MongoDB可视化操作以及shell使用及命令,备份恢复.数据导入导出. MongoVUE安装和简单使用 使用mongo.exe 管理数据库虽然可行,功能也挺强大,但每次都要敲命令,即繁 ...

  4. mongodb数据库添加权限及简单数据库命令操作笔记

    加固mongodb建议:修改数据库默认端口,添加数据库访问权限: 启动数据库(裸奔):C:\mongodb\bin>mongod --dbpath C:\MongoDB\data(同时用--db ...

  5. smarty半小时快速上手入门教程

    http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...

  6. mongodb的TTL索引介绍(超时索引)

    TTL索引是mongodb新支持的用于延时自动删除记录的一种索引.它仅包含一个字段,该字段值需要是Date()类型,并且不支持复合索引.可以指定某条记录在延时固定时间后自动删除.数据自动超时删除主要用 ...

  7. MongoDB之数据库命令操作(二)

    现在详细学习一下mongodb的数据库操作. 查询语句 db.xxx(集合name).find() # 查询 db.xxx(集合name).findOne() # 只返回一个 db.xxx(集合nam ...

  8. Entity Framework入门教程(17)---记录和拦截数据库命令

    记录和拦截数据库命令 这一节介绍EF6怎么记录和拦截发送给数据库的查询和操作命令. 1.记录EF发送给数据库命令(DbContext.Database.Log) 以前给了查看EF发送给数据库的命令我们 ...

  9. MongoDB源码分析——mongod数据查询操作

    源码版本为MongoDB 2.6分支 Edit mongod数据查询操作 在mongod的初始化过程中说过,服务端接收到客户端消息后调用MyMessageHandler::process函数处理消息. ...

随机推荐

  1. wamp的搭建-个人笔记

    #wamp的配置 ##选项 1. 用apache 就下ts的 2. 是nginx或者iis 就用nts的 3. php win下面的 选择zip 或者msi的 ##apache的配置 1.配置apac ...

  2. 最近项目用到Dubbo框架,分享一下~

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  3. Hibernate参数绑定的五种方式

    Hibernate参数绑定 参数绑定优点: (1)安全性 防止用户恶意输入条件和恶意调用存储过程 (2)提高性能 底层采用JDBC的PreparedStatement预定义sql功能,后期查询直接从缓 ...

  4. 进军VR虚拟现实-先来全景智慧城市-有梦想的互联网创业者

    随着VR的大火,越来越多的企业开始进军VR行业,不过并不是所有企业进军VR行业都是成功的,那么问题来了,VR虚拟现实行业投资怎么做才能取得成功呢?这是当下很多企业面临的一个问题,VR虚拟现实行业投资也 ...

  5. javaWeb学习总结(3)- 通过Servlet生成验证码图片(2)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  6. 开涛spring3(6.9) - 对JDBC的支持 之 7.1 概述

    7.1  概述 7.1.1  JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTes ...

  7. SmartCoder每日站立会议06

    站立会议内容 讨论了小程序的具体实现方式,主要会加入地图这一元素,使程序看起来更加的方便直观,同时也会使人感到新颖.在对各个点的评论对话功能也在考虑中. 1. 站立会议照片: 2.任务展板 3.燃尽图

  8. 快速傅里叶变换(FFT)算法【详解】

    快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...

  9. python基础 - 01

    python 变量名 在python中的变量命名,与其他语言大体相似,变量的命名规则如下: 变量名是数字.字母.下划线的任意组合 变量名的第一个字符不能是数字 系统的关键字不能设置为变量名    Ti ...

  10. 1089 Intervals(中文)

    开始前先讲几句废话:这个题我开始也没看懂,后来借助百度翻译,明白了大概是什么意思. 试题描述 输入一个n,然后输入n组数据,每个数据有两个数,代表这个闭区间是从几到几.然后看,如果任意两个闭区间有相重 ...