文章目录
- 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨
- 前言
- MongoDB
- MongoDB体系结构
- MongoDB数据模型
- MongoDB部署
- 安装服务器
- 启动服务器
- Shell连接(mongo命令)
- MongoDB可视化工具
- MongoDB命令基本常用
- ⭐权限数据库
- ⭐辅助命令
- ⭐集合
- ⭐文档
- 文档插单条数据
- 文档插入多条数据
- 文档查询
- 文档更新
- 删除文档
- 统计查询
- ⭐MongoDB使用功能
- 📕 分页列表查询
- ⭐常用命令小结
- ⭐索引 ~ Index
- 索引的类型
- 索引的管理操作
- 索引的使用
- 涵盖的查询用
- MongoDB导出与导入
- 总结
文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨
⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸ ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇ 不能 ⡏⠀⠀ ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇ 白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽
前言
MongoDB
是由C++语言编写的,是一个介于 关系数据库
和 非关系数据库之间的产品
,是非关系数据库当中功能最丰富,最像关系数据库的。 它支持的 数据结构 非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的 数据类型
。MongoDB用起来快速上手&集群和安全系列。
MongoDB
-
业务应用场景
-
传统的关系型数据库(如:
MySQL
),在数据操作的“三高”需求以及应对Web2.0的网站 什么是Web 2.0 需求面前,显得力不从心。 -
解释:三高需求
1、High performance - 对数据库
高并发读写的需求
。
2、Huge Storage - 对海量数据的高效率存储和访问的需求
。
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
。
4、而MongoDB
可应对“三高”需求。 -
具体的应用场景
1、存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2、存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3、存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
4、存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5、存储用户信息、点赞互动信息等。
6、数据操作的共同特点
:数据量大、写入操作频繁(读写都很频繁)、价值较低的数据,对事务性¥
要求不高
-
-
特点
- 高性能 :对嵌入式数据模型的支持减少了数据库系统上的I/O活动。
- 高扩展性 :MongoDB提供了水平可扩展性作为其核心功能的一部分。
- 易使用 :MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余
- 丰富的查询支持 : MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
- 其他特点 : 如无模式(动态模式)、灵活的文档模型
-
什么时候选择MongoDB?
-
解释:应用不需要事务及复杂 Join 支持
-
新应用,需求会变,数据模型无法确定,想快速迭代开发
-
应用需要2000-3000以上的读写QPS(更高也可以)
-
应用需要TB甚至 PB 级别数据存储
-
应用发展迅速,需要能快速水平扩展
-
应用要求存储的数据不丢失
-
应用需要99.999%高可用
-
应用需要大量的地理位置查询、文本查询
-
如果上述有1个符合,可以考虑 MongoDB,2个及以上的符合,选择 MongoDB 绝不会后悔。
-
MongoDB体系结构
-
MySQL和MongoDB对比
-
Mysql (关系型数据库) 由
数据库、表、行
组成 。 -
MongoDB (非关系型数据库) 由
数据库、集合、 文档
组成。 -
Mysql 与 MongoDB术语区别
1、Mysql
→_→
数据库(database)、表(table)、行(row)、字段(column)、索引(index)、表连接(table joins)、嵌入文档(不支持)、主键(primary key → 主键)2、MongoDB
→_→
数据库(database)、表 →集合
(collection)、行 →文档
(document)、字段 →域
(field)、索引
(index)、表连接
(MongoDB不支持)、嵌入文档
(MongoDB通过嵌入式文档来替代多表连接)、主键
(primary key → MongoDB自动将_id字段设置为主键)
-
MongoDB数据模型
-
MongoDB的最小存储单位就是文档(document)对象。
文档(document)对象对应于关系型数据库的行
。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。 -
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,
支持内嵌的文档对象和数组对象
,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。 -
BSON采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,
具有轻量性、可遍历性、高效
性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。 -
Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括 date,object id,binary data,regular expression 和code。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息。
BSON结构 ↓
{
name: "lemo",
age: "12",
address: {
city: "suzhou",
country: "china",
code: 215000
}
scores: [
{
"name": "english", "grade:3.0},
{ "name": "chinese", "grade:2.0}
]
}
BSON数据类型参考列表 ↓
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | UTF - 8字符串都可表示为字符串类型的数据 | { “x” : “foobar” |
对象id | 对象id是文档的12字节的唯一 ID | { “X” : ObjectId() } |
布尔值 | 真或者假:true或者false | { “x”: true } + |
数组 | 值的集合或者列表可以表示成数组 | { “x” :[“a”, “b”, “c”] } |
32位整数 | 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。 | shell是不支持该类型的,shell中默认会转换成64位浮点数 |
64位整数 | 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数 | shell是不支持该类型的,shell中默认会转换成64 |
64位浮点数 | shell中的数字就是这一种类型 | { “x”:3.14159,“y”:3 } |
null | 表示空值或者未定义的对象 | { “x”: null } |
undefined | 文档中也可以使用未定义类型 | { “x”: undefined } |
符号 | shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 | |
正则表达式 | 文档中可以包含正则表达式,采用JavaScript的正则表达式语法 | { “x” : /foobar/i } |
代码 | 文档中还可以包含JavaScript代码 | { “x” : function() { /* …… */ } } |
二进制数据 | 二进制数据可以由任意字节的串组成,不过shell中无法使用 | |
最大值 / 最小值 | BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。 |
提示 : shell默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或 NumberLong(8字节符号整数),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
MongoDB部署
安装服务器
- 安装 : https://www.mongodb.com/download
- 版本选择 MongoDB的版本命名规范如:x.y.z;
- y为奇数时表示当前版本为
开发版
,如:1.5.2、4.1.13; - y为偶数时表示当前版本为
稳定版
,如:1.6.3、4.0.10; - z是修正版本号,数字越大越好。
- 详细 : https://www.mongodb.com/详情
- y为奇数时表示当前版本为
启动服务器
-
方法1:命令行参数方式启动服务
1、bin 目录中打开命令行提示符、命令 :
mongod --dbpath=path(存放的路径 : 自己创建的文件路径)
(服务器文件会自动生成)如 :
mongod.exe --dbpath=E:\MongodbServer\data
2、方便使用 : 可以将安装目录的bin目录设置到环境变量的path中, bin 目录下是一些常用命令,比如
mongod
启动服务用的,mongo 客户端连接服务用的。3、两种启动方法
第一种
第二种
-
方法2:配置文件方式启动服务
1、在解压目录中新建 conf 文件夹,该文件夹 中 新建配置文件 mongod.conf
2、参数 ↓
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath:(这里需要空格)(存放的路径)
3、详细配置项内容可以参考官方文档 https://www.mongodb.com/配置项
4、注意
: 配置文件中如果使用双引号,比如路径地址,自动会将双引号的内容转义。如果不转义,则会报错 。
error-parsing-yaml-config-file-yaml-cpp-error-at-line-3-column-15-unknown-escape-character-d
解决问题 : a
: 对 \ 换成 / 或 \ 、 b
: 如果路径中没有空格,则无需加引号。
5、注意
:配置文件中不能以Tab分割字段
解决问题 : 将其转换成空格。
6、启动服务
方法1 : mongod -f …/config/mongod.conf
方法2 : mongod --config …/config/mongod.conf
启动成功
7、更多参数配置
systemLog:
destination: file
#The path of the log file to which mongod or mongos should send all diagnostic logging information
path: "D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/log/mongod.log"
logAppend: true
storage:
journal:
enabled: true
#The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/data"
net:
#bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: false
Shell连接(mongo命令)
- 链接服务器命令
第一步 : 服务器路径下 运行CMD
第二步 : 使用启动命令
1. Mongo
2. mongo --host=127.0.0.1 --port=27017
- Mongodb基础命令
查看已经有的数据库 : show databases
退出mongodb : mongodb
更多参数可以通过帮助查看 : mongo --help
提示 : Mongodb支持JS程序
MongoDB可视化工具
- Studio 3T
- 链接 : https://robomongo.org/Studio 3T
- 功能 : Studio 3T 具有更多更强大的功能并提供企业支持服务,支持副本集、独立主机和分片集群连接,支持导入导出,SQL 查询,语法填充,支持 MongoDB 4.0+ 等等。适用于 Windows,macOS 和 Linux。
付费
:30 天的免费试用期。
- Robo 3T (Robomong) (推荐)
- 链接 : https://robomongo.org/
- 功能 : 支持 MongoDB 4.0+,轻量级 GUI,支持语法填充等等。适用于 Windows,macOS 和 Linux 系统。
免费
- Navicat for MongoDB
- 链接 : https://www.navicat.com.cn/download/navicat-for-mongodb
- 功能 : 支持多种数据库的集成,已集成 MongoDB 类型,属于付费型管理工具。好处是用会了一个 DB 版的 Navicat,所有 DB 版都会很顺手,维持一套操作习惯,如果再肌肉记忆一些快捷键,会更加高效。
付费
:付费型管理工具。
MongoDB命令基本常用
⭐权限数据库
|
---|
⭐辅助命令
|
---|
|
---|
⭐集合
|
---|
⭐文档
文档插单条数据
- 语法
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
- 参数
Parameter | Type | Description |
---|---|---|
document | document or array | 要插入到集合中的文档或文档数组。(json格式) |
writeConcern | document | 表达写关注点的文档。 |
ordered | boolean | 可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回而不处理数组中的其余文档。如果为假,则执行无序插入,如果其中一个文档出现错误,则继续处理数组中的主文档。在版本2.6 + 中默认为true |
- 演示
//向Name集合种插入一条数据
db.name.insert 或 save(
{
name:"小明",
age:"18",
ordered:<boolean>
}
)
db.name.save({name:"xiaogming"})
- 提示
1 comment集合如果不存在,则会隐式创建
2 mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
3 插入当前日期使用 new Date()
4 插入的数据没有指定 _id ,会自动生成主键值
5 如果某字段没值,可以赋值为null,或不写该字段。
//输出结果为 WriteResult({ "nInserted" : 1 }) → 说明插入一个数据成功了。
- 注意
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
- 文档键命名规范
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
文档插入多条数据
- 语法
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
- 参数
Parameter | Type | Description |
---|---|---|
document | document | 要插入到集合中的文档或文档数组。(json格式) |
writeConcern | document | 文档内容 |
ordered | boolean | 可选。一个布尔值,指定Mongod实例应执行有序插入还是无序插入。默认为true。 |
- 演示
db.name.insertMany(
[
{
name: "小明",
age: "18",
ordered: true
},
{
name: "小明",
age: "18",
ordered: true
}
]
)
- 提示
1. 插入时指定了 _id ,则主键就是该值。
2. 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
3. 因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。
try {
db.name.insertMany(
[
{
name: "小明",
age: "18",
ordered: true
},
{
name: "小明",
age: "18",
ordered: true
}
]
)
} catch (error) {
print(error)
}
文档查询
- 语法
db.collection.find(, [projection])
- 参数
Parameter | Type | Description |
---|---|---|
query | document | 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档({})。 |
projection | document 可选。 | 指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,请省略此参数。 |
- 查询演示
条件查询
查询 : db.comment.find({userid:'1003'})
条件查询 : db.comment.findOne({userid:'1003'})
- 投影查询
作用 :查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
语法说明 : db.collection.find({属性名:“符合条件的Value值”},{属性名:(1表示显示,0表示不显示),nickname:(1表示显示,0表示不显示)})
演示
文档
{ "_id" : "4", "userid" : "1002", "nickname" : "凯撒" }
{ "_id" : "5", "userid" : "1003", "nickname" : "凯撒" }
使用查询语法
db.comment.find({userid:"1003"},{userid:0,nickname:1,"_id":0})
结果
{"nickname" : "凯撒" }
文档更新
- 语法
db.collection.update(query, update, options)
//或
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2
}
)
- 参数 (主要关注前四个参数即可)
- 更新演示
(1)覆盖的修改
db.comment.update({_id:"1"},{likenum:NumberInt(1001)})
(2)局部修改
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}})
(3)批量的修改
//默认只修改第一条数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒2"}})
//修改所有符合条件的数据
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true})
(4)列值增长的修改 → 如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc运算符来实现。
功能 对ID为3的数据的点赞数,每次递增1
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})
删除文档
- 语法
db.集合名称.remove(条件)
- 演示
db.comment.remove({})
- 如果删除_id=1的记录,输入以下语句
db.comment.remove({_id:“1”})
统计查询
- 语法
db.collection.count(query, options)
- 参数
Parameter | Type | Descriptionquery |
---|---|---|
query | document | 查询选择条件。 |
options | document | 可选。用于修改计数的额外选项。 |
- 查询演示
统计查询
查询 : 统计集合的所有的记录数 db.collection.count()
条件查询 : db.collection.count({userid:'1003'})
//默认情况下 count()方法返回符合条件的全部记录条数。
⭐MongoDB使用功能
📕 分页列表查询
代码演示
说明 :可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。
db.Collection.find().limit(n).skip((n-1)*n)
如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN)
db.Collection.find().limit(3)
skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
db.Collection.find().skip(3)
提示 skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。
⭐常用命令小结
常用的小结
选择切换数据库:use articledb
插入数据:db.comment.insert({ bson数据 })
查询所有数据:db.comment.find();
条件查询数据:db.comment.find({ 条件 })
查询符合条件的第一条记录:db.comment.findOne({ 条件 })
查询符合条件的前几条记录:db.comment.find({ 条件 }).limit(条数)
查询符合条件的跳过的记录:db.comment.find({ 条件 }).skip(条数)
修改数据:db.comment.update({ 条件 }, { 修改后的数据 }) 或db.comment.update({ 条件 }, { $set: { 要修改部分的字段: 数据 })
修改数据并自增某字段值:db.comment.update({ 条件 }, { $inc: { 自增的字段: 步进值 } })
删除数据:db.comment.remove({ 条件 })
统计查询:db.comment.count({ 条件 })
模糊查询:db.comment.find({ 字段名: /正则表达式/ })
条件比较运算:db.comment.find({ 字段名: { $gt: 值 } })
包含查询:db.comment.find({ 字段名: { $in: [值1,值2] } })或db.comment.find({ 字段名: { $nin: [值1,值2] } })
条件连接查询:db.comment.find({ $and: [{ 条件1 }, { 条件2 }] })或db.comment.find({ $or: [{ 条件1 }, { 条件2 }] })
⭐索引 ~ Index
-
说明 : 索引支持在MongoDB中高效地执行查询。如果没有索引,
MongoDB必须执行全集合扫描,即扫描集合中的每个文档
,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。 -
如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。
-
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外MongoDB还可以使用索引中的排序返回排序结果。
-
索引链接 : https://docs.mongodb.com/manual/indexes
索引的类型
- 单字段索引
- MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。
- 对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。
图示
- 复合索引
- MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。
- 复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由 { userid: 1, score: -1 }组成,则索引首先按userid正序排序,然后在每个userid的值内,再在按score倒序排序。
图示
索引的管理操作
-
索引的查看
- 说明:返回一个集合中的所有索引的数组。
- 语法:
db.collection.getIndexes()
*
MongoDB 3.0+ - 默认_id索引 : MongoDB在创建集合的过程中,在 _id字段上创建一个唯一的索引,默认名字为 id,该索引可防止客户端插入两个具有相同值的文档,您不能在_id字段上删除此索引。
注意
:该索引是唯一索引,因此值不能重复,即 _id值不能重复的。在分片集群中,通常使用 _id作为片键。
-
索引的创建
- 说明:在集合上创建索引。
- 语法:
db.collection.createIndex(keys, options)
- 提示:3.0.0 版本前创建索引方法为 db.collection.ensureIndex() ,之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
- 参数
Parameter | Type | Description |
---|---|---|
keys | document | 包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型。对于字段上的升序索引,请指定值1;对于降序索引,请指定值 - 1。比如: { 字段: 1或 - 1 } ,其中1 为指定按升序创建索引,如果你想按降序来创建索引指定为 - 1 即可。另外,MongoDB支持几种不同的索引类型,包括文本、地理空间和哈希索引。 |
options | document | 可选。包含一组控制索引创建的选项的文档。有关详细信息,请参见选项详情列表。 |
- 代码演示
单字段索引示例:对 userid 字段建立索引
db.collection.createIndex({userid:1})
复合索引 对 userid 和 nickname 同时建立复合(Compound)索引
db.collection.createIndex({userid:1,nickname:-1})
db.collection.getIndexes()
- 索引的移除
说明:可以移除指定的索引,或移除所有索引
-
指定索引的移除
1、语法 :db.collection.dropIndex(index)
2、参数 : 指定要删除的索引。可以通过索引名称或索引规范文档指定索引。若要删除文本索引,请指定索引名称。 -
所有索引的移除
1、语法 :db.collection.dropIndexes()
2、参数 : 指定要删除的索引。可以通过索引名称或索引规范文档指定索引。若要删除文本索引,请指定索引名称。
索引的使用
说明:分析查询性能(Analyze Query Performance)通常使用执行计划(解释计划、Explain Plan)来查看查询的情况,如查询耗费的时间、是否基于索引查询等。
- 语法
db.collection.find(query,options).explain(options)
- 使用过程 演示 ↓
db.createCollection("InDetail")
db.InDetail.insert({name:"小红",age:18,sex:"女",hobby:"喜欢运运动"})
db.InDetail.createIndex({userID:5})
db.InDetail.find({userID:5}).explain()
结果 ↓
-
关键看 “stage” 属性
- 属性为"COLLSCAN", 表示全集合扫描
- 属性为"FETCH", 表示索引扫描
涵盖的查询用
说明 : 当查询条件和查询的投影仅包含索引字段时,MongoDB直接从索引返回结果,而不扫描任何文档或将文档带入内存。 这些覆盖的查询可以
非常有效。
官方链接 : https://docs.mongodb.com/
图解
- 使用过程 演示 ↓
db.createCollection("InDetail")
db.InDetail.insert({userID:5,name:"小红",age:18,sex:"女",hobby:"喜欢运运动"})
db.InDetail.find({userID:5},{userID:1,_id:0}) → { "userID" : 5 }
db.InDetail.find({userID:5},{userID:1,_id:0}).explain()
结果 ↓
MongoDB导出与导入
- 导出数据库 语法👇
mongodump -h IP地址 -d 数据库名 -o url (储存到哪❓)
- 导入数据库 语法👇
mongorestore -h IP地址 -d 数据库名 url (导入的数据库Url❓)
- 导出表 语法👇
mongoexport -h IP地址 -d 数据库名 -c 表名 -o url (储存到哪❓)例如 :C:\ ------ \home_carousel_lists.json
- 导入表 语法👇
// mongoimport -h IP地址 -d 数据库名称 -c 表名 --type 格式(可省略,默认json) --file 需要导入的文件
mongoimport-h IP地址 -d 数据库名 -c 表名 --type=json --file= url (导入的表Url❓)例如 :–type=json --file=C:\ ------ \home_carousel_lists.json
总结
以上是个人学习Mongodb的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波👍