MongDB 入门
官网下载地址
- 部署
- 数据库、汇合、文档的基本操作
- 索引
1 单机部署
- 下载、解压、配置
- 启动数据库
- 连贯数据库
1.1 Windows 下启动
下载后 解压 至本地
在解压后文件里 创立 一个目录用于存储数据文件 data/db
形式 1 :命令行参数形式启动服务
在 bin 目录中执行如下命令:
mongod --dbpath=..\data\db
默认端口 27017,能够通过 port 指定端口
能够将 bin 目录设置到环境变量 path 中,方便使用一些命令
形式 2 :配置文件形式启动服务
新建 config 文件夹,在文件夹下新建配置文件 mongod.config
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath: F:\mongodb-5.0.2\data\db
在 bin 下执行
mongod -f ../config/mongod.config
或
mongod --config ../config/mogod.config
默认端口 27017
在部署我的项目时,应用这种办法,有具体的参数
1.2 连贯数据库
1.2.1 Shell 连贯(mongo 命令)
在 bin 下新关上一个 shell 窗口
连贯
mongo
或
mongo --host=localhost --port=27017
查已有数据库
>show databases
退出 mongodb
exit
更多参数
mongo --help
MongoDB javascript shell 是一个基于 JavaScript 的解释器,反对 js 程序
1.2.2 Compass 图形化界面的应用
下载地址抉择社区版
填入 ip 与端口号 间接连贯即可
1.3 Linux 下启动与连贯数据库
将下载的 linux 版本的 MongoDB 拷贝到服务器
-
下载、解压、挪动
sudo su sudo yum install libcurl openssl wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.2.tgz tar -xvf mongodb-linux-x86_64-rhel70-5.0.2.tgz mv mongodb-linux-x86_64-rhel70-5.0.2 /usr/local/mongodb
-
新建目录,存储数据和日志
# 数据存储 mkdir -p /mongodb/single/data/db #日志存储 mkdir -p /momgodb/single/log
-
新建配置文件
vi /mongodb/single/mongod.config
-
配置文件
systemLog: #MongoDB 发送所有日志输入的指标指定文件 ##The path of the log file to which mongod or mongos should send all diagnostic logging information destination: file #mongo 或 mongos 应向发送所有诊断日志记录信息的日志文件门路 path: "/mongodb/single/log/mongod.log" #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端 logAppend: true storage: #mongod 实例存储数据的目录 storage.dbPath 设置仅应用于 mongd ##The directory where the mongod instance stores its data.Default Value is "/data/db". dbPath: "/mongodb/single/data/db" journal: #启用或禁止持久性日志以确保数据文件放弃无效和可复原 enabled: true processManagement: #启用在后盾运行 mongos 或 mongod 过程的守护过程模式 fork: true net: #服务实例绑定的 IP,默认是 localhost bindIp: localhost,172.19.18.168 #bindIP 局域网 IP - ifconfig #绑定端口,默认为 27017 port: 27017
备用
# 数据库门路 dbpath=/mongodb/single/data/db #日志输入文件门路 logpath=/mongodb/single/log/mongod.log #谬误日志采纳追加模式 logappend=true #启用日志文件,默认启用 journal=true #这个选项能够过滤掉一些无用的日志信息,若须要调试应用请设置为 false quiet=true #端口号 默认为 27017 port=27017 #容许近程拜访(服务器局域网 ip 用 ifconfig 查看)bind_ip=localhost,172.19.18.168 #开启子过程 fork=true #开启认证,必选先增加用户,先不开启(不必验证账号密码)#auth=true
-
启动 MongoDB 服务
# 启动 /usr/local/mongodb/bin/mongod -f /mongodb/single/mongod.config 或 export PATH=/usr/local/mongodb/bin:$PATH mongod -f /mongodb/single/mongod.config #设置明码 mongo use admin db.createUser({user:"root",pwd:"password",roles:["root"]}) db.auth('root','password')
能够将 export PATH=/usr/local/mongodb/bin:$PATH 增加到 /etc/profile 文件中
这样不必每次都设置环境变量vim /etc/profile 增加在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 之后
设置明码须要在配置中增加
auth = true
-
通过过程来查看服务是否启动
ps -ef |grep mongod
-
Compass 连贯服务
host: 公网 IP 端口:27017
防火墙开启与敞开
# 查看防火墙转态 systemctl status firewalld #长期敞开防火墙 systemctl stop firewalld #开启防火墙 systemctl start firewalld #开机禁止启动防火墙 systemctl disable firewalld #开机启用防火墙 systemctl enable firewalld
增加防火墙端口
# 凋谢端口 firewall-cmd --zone=public --add-port=27017/tcp --permanent #防火墙从新加载配置 firewall-cmd --reload #查问凋谢的端口 firewall-cmd --list-port #敞开一个防火墙端口 firewall-cmd --zone=public --remove-port=27017/tcp --permanent
敞开服务
# 形式 1 kill -2 过程号 #形式 2 pkill mongod
- 可能呈现的问题
启动失败 :个别就是配置文件的门路或者短少必要的配置项,或者是启动命令谬误
连贯失败 :如果是云服务器
,先查看防火墙规定或平安组是否放行 27017 端口,这里能够不在 shell 中操作,间接手动增加。查看配置文件的 bindIp,批改为 0.0.0.0,或者在 localhost 后增加内网 ip
# 本地 cmd 连贯服务器数据库 mongodb/din] mongo --host= 外网 IP
2 根本常用命令
- 数据库的抉择、创立、删除
- 汇合的创立与删除
- 文档的 CRUD
2.1 数据库操作
2.1.1 抉择和创立数据库
# 查看有权查看的所有数据库
> show dbs
> show datadases
#抉择或创立一个数据库
> use dbname
- use dbname,dbname 存在时则抉择进入该数据库,不存在时创立数据库并进入
默认
进入的数据库为 test
2.1.2 数据库的删除
# 查看以后数据库
> db
#删除以后数据库
> db.dropDatabase()
- db 示意以后数据库,可视为一个
对象
,下面有很多办法
admin:root,增加一个用户到此数据库,该用户主动继承所有数据库权限。一些特定服务器命令只能从这个数据库运行 – 列出所有数据库或敞开服务器
local:该数据库永远不会被复制,能够用来存储限于本地单台服务器的任意汇合
config:当 Mongo 用于分片设置时,config 数据库在外部应用,用于保留分片的相干信息
2.2 汇合操作
2.2.1 汇合的显示创立
# 显式创立汇合 - 关系数据库中的表
db.createCollection(name)
#查看汇合
show collections
2.2.2 汇合的隐式创立
向一个汇合插入一个文档的时候,如果汇合不存在,则会主动创立汇合
举荐应用此办法隐式创立文档
2.2.3 删除一个汇合
# 删除汇合
db.collectionName.drop()
#查看
show collections
2.3 文档根本 CRUD
2.3.1 文档的插入
-
单文档插入
应用insert()
或save()
办法向汇合插入文档db.collectionName.insert( <document or array of document>, { writeConcern: <document>, ordered: <boolean> } )
- document 要插入到汇合的文档或文档数组(json 格局)
- writeConern 性能与可靠性的级别
- ordered 插入时是否排序
// 示例 db.comment.insert( { "articleid":"100", "content":"针不戳", "useid":"10", "nickname":"Jack", "creatdatetiem":new Date(), "likenum":NumberInt(10), "state":null } )
-
批量插入
应用inserMany()
db.collectionName.insertMany([<document1> , <document2> , ...], { writeConern:<document>, ordered:<boolean> } )
// 示例 db.comment.insertMany([ { "articleid":"100", "content":"针不戳", "useid":"10", "nickname":"Jack", "creatdatetiem":new Date(), "likenum":NumberInt(10), "state":null }, { "articleid":"100", "content":"这垃圾袋挺能藏啊", "useid":"1", "nickname":"pig", "creatdatetiem":new Date(), "likenum":NumberInt(1000), "state":null } ])
2.3.2 文档的根本查问
应用find()
db.collectionName.find(<query>,[projection])
- query:可选,应用查问运算符指定筛选范畴
- projection:可选,指定要在与查问筛选器匹配的文档中返回的字段
# 全副查问
db.comment.find()
#条件查问
db.comment.find({"useid":"10"})
#单文档条件查问
db.comment.findOne({"useid":"10"})
#投影查问
db.comment.find({"useid":"10"},{"useid":1,"_id":0})
- 投影查问第一个参数为条件,第二个参数为要显示的数据
插入错误处理,将操作写在 try 中,catch 捕捉谬误并
2.3.3 文档的更新
应用update()
db.collectionName.update(query,update,options)
db.collectionName(
<query>,
<update>,
{
upsert:<boolean>,
nulti:<boolean>,
writeConcern:<document>,
collation:<document>,
arrayFilters:[<filterdocument1>,...],
hint:<document|string> //MondoDB 4.2
}
)
# 笼罩的批改 - 只保留更新的数据
db.comment.update(useid:"1",{content:"叫学姐"})
#部分的批改 - $set
db.comment.update({useid:"10"},{$set:{content:"学姐再见"}})
#批量批改 - multi:true 批改所有符合条件的数据
db.comment.update({useid:"10"},{$set:{content:"学姐再见"}},{multi:true})
#列值增长的批改 - $inc
db.comment.update({useid:"10"},{$inc:{likenum:NumberInt(1)}})
updateOne
与updateMany
能够别离单条与多条的批改
2.3.4 文档的删除
应用remove()
db.collectionName.remove(条件)
# 删除 1 或多个
db.comment.remove({content:"学姐好"})
db.comment.remove({useid:"10"})
#全副删除
db.comment.remove({})
deleteOne 与 deleteMany 能够单条与多条的删除
2.4 文档的分页查问
2.4.1 统计查问
应用count()
db.collectionName.count(query,options)
- query:查问条件
- options:可选,批改计数的额定选项
# 统计所有记录
db.comment.count()
#按条件统计记录
db.comment.count({likenum:10})
2.4.2 分页列表查问
应用 limit()
读取指定数量的数据,skip()
跳过指定数量的数据
db.collectionName.find().limit(num).skip(num)
# 跳过 2 条显示 2 条数据
db.comment.find().limit(2).skip(2)
2.4.3 排序查问
应用 sort() 按某字段升序或降序查问 1 为升序,- 1 位降序
db.collectionName.find().sort({KEY:1})
# 对 useid 升序排列 雷同 id 按点赞数升序
db.comment.find({},{useid:1,likenum1}).sort({useid:1,likenum:1})
尽量保障排序的字符串数据位数雷同
sort 排序会从首位比拟
2.5 其余查问形式
2.5.1 正则的简单条件查问
db.collectionName.find({字段:/ 正则 /})
db.comment.find({content:/ 齐刷的 /})
2.5.2 比拟查问
< ,<= ,> ,>= ,!=
# > 的应用 $gt
db.collectionName.find({字段:{$gt: 值}})
# < 的应用 $lt
db.collectionName.find({字段:{$lt: 值}})
# >= 的应用 $gte
db.collectionName.find({字段:{$gte: 值}})
# <= 的应用 $lte
db.collectionName.find({字段:{$lte: 值}})
# != 的应用 $ne
db.collectionName.find({字段:{$ne: 值}})
# 查问点赞数大于两百的数据
db.comment.find({likenum:{$gt:200}})
2.5.3 蕴含查问
应用$in
db.colletionName.find({字段:{$in:["val1","val2"]}})
# 查找 id 为 1 和 2 的数据
db.comment.find({useid:{$in:["1","2"]}})
2.5.4 条件连贯查问
应用$and
与 $or
db.collection.find({$and:[{},{},{}]})
db.collection.find({$or:[{},{},{}]})
# 查找点赞数大于 100 小于 1000 的文档
db.comment.find({$and:[{likenum:{$gt:100}},{likenum:{$lt:1000}}]})
#查找 id 为 1 和 2 的文档
db.comment.find({$or:[{useid:"1"},{useid:"2"}]})
3 索引 – Index
- 索引介绍 – 类型与长处
- 索引的操作
- 索引的性能
3.1 概述
- MongoDB 的索引应用了 B -Tree,MySQL 是 B +Tree,在结构上 MySQL 反对随机和程序查找
- 应用 B 树数据结构遍历结点,结点内应用程序查找或二分查找去查找关键字,查找失败确定范畴到下一级结点,直到查找胜利或返回 null
- 应用索引能够
缩小
查问的汇合,不必遍历所有的汇合晋升查问效率
3.2 索引类型
3.2.1 单字段索引
- 在文档的单字段上创立用户定义的升序 / 降序索引
-
能够在任何方向上遍历索引
# 升序 {userid:1}
3.2.2 复合索引
- 多个字段的用户定义的索引
-
先按一个去排序,雷同的值按其余字段再排序
# 按 id 升序,雷同 id 按 num 降序 {userid:1,num:-1}
3.2.3 其余索引
- 天文空间索引
返回后果时应用平面几何的二维索引
返回后果时应用球面几何的二维球面索引 - 文本索引
反对在搜寻字符串内容,这些文本索引不存储特定语言的进行词,而将几何中的词作为词干,只存储词根 - 哈希索引
对字段值的散列进行索引,这些索引在其范畴内的值散布更加随机,但反对相等匹配,不反对基于范畴的查问
3.3 索引的治理操作
3.3.1 查看索引
-
返回几何中所有索引的数组
db.collectionName.getIndexes()
# 查问 comment 几何所有的索引 db.comment.getIndexes() [{ v: 2, key: { _id: 1}, name: '_id_' } ]
默认以
_id
为索引
3.3.2 创立索引
-
在汇合上创立索引
db.collectionName.createIndex(keys,options)
keys:键值对文档,键为字段,值为 1 或 -1。也能够是其余索引类型
options:可选,管制索引创立的选项文档unique:<Boolean/> 索引是否惟一
name:<String/> 索引名称,能够对复合索引重命名
sparse:<Booeal/> 不存在的字段不启用索引
weights:<document/> 索引权重值,优先级 1 -99999
其余参数可参考文档# 在 comment 上增加一个降序的索引 db.comment.createIndex({useid:-1}) #查看索引 db.comment.getIndexes() [{ v: 2, key: { _id: 1}, name: '_id_' }, {v: 2, key: { useid: -1}, name: 'useid_-1' } ]
3.3.3 删除索引
- 能够移除指定索引,或删除所有索引
1. 指定删除
# 删除指定索引
db.collectionName.dropIndex(index)
index 能够是 name 也能够是 key
# 删除 comment 汇合的 useid 字段降序的索引
db.comment.dropIndex("useid_-1")
{nIndexesWas: 2, ok: 1}
2. 删除全副
# 删除全副索引
db.collectionName.dropIndexes()
_id 是不会被删除的
3.4 应用索引
3.4.1 执行打算
- 剖析查问性能通 应用 执行打算来察看查问状况
-
查问消耗的事件、是否基于索引查问
db.collectionName.find(query,options).explain(options)
# 查问 useid 为 2 的文档 db.comment.find({useid:"2"}).explain()
返回的参数中
WinningPlan
的stage
参数记录了查问的形式,索引还是全局
3.4.2 涵盖的查问
- 当查问条件和查问投影仅蕴含索引字段时,MongoDB 间接从索引返回后果
-
不扫描任何文档或将文档带入内存
# 查问 likenum 为大于 10 的文档,仅返回 likenum db.comment.createIndex({likenum:1}) db.comment.find({likenum:{$gt:10}},{likenum:1,_id:0}).expalin()
查问条件与返回的后果仅只有 likennum,间接在 likenum 索引里遍历即可,
不必遍历文档