每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作

本文主要是介绍每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

准备工作

继续连接到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"})

 本文转自邹琼俊博客园博客,原文链接:http://www.cnblogs.com/jiekzou/p/7092158.html,如需转载请自行联系原作者

这篇关于每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804105

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc