Mongo进阶
第1章 Mongo基本操作
1.1 介绍
CRUD 操作是create(创建), read(读取), update(更新)和delete(删除) 文档。
MongoDB 不支持SQL 但是支持自己的丰富的查询语言。
在MongoDB 中,存储在集合中的每个文档都需要一个唯一的_id 字段,作为主键。如果插入的文档省略了该_id字段,则MongoDB 驱动程序将自动为该字段生成一个ObjectId_id。也用于通过更新操作插入的文档upsert: true.
如果文档包含一个_id 字段,该_id 值在集合中必须是唯一的,以避免重复键错误。
在MongoDB 中,插入操作针对单个集合。MongoDB 中的所有写操作都是在单个文档的级别上进行的
1.2 显示命令
1 | Help: 显示帮助。 |
1.3 MongoDB CRUD操作
官方文档 https://docs.mongodb.com/manual/crud/
1.插入文件
1 | db.inventory.insertOne() |
单行插入
1 | db.inventory.insertOne( |
多行插入
1 | db.inventory.insertMany([ |
2.查询数据
查询所有
1 | db.inventory.find( {} ) |
指定条件查询
1 | db.inventory.find( { status: "D" } ) |
指定条件下使用查询运算符
从inventory 集合中检索status等于”A”或的所有文档”D”
1 | db.inventory.find( { status: { $in: [ "A", "D" ] } } ) |
指定AND条件
检索inventory 集合中status等于”A” 和 qty数量$lt小于30的所有文档
1 | db.inventory.find( { status: "A", qty: { $lt: 30 } } ) |
指定OR条件
检索inventory 集合中status等于”A” 或 qty数量$lt小于30的所有文档
1 | db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) |
指定AND和OR条件
1 | db.inventory.find( { |
查看数据库命令
1 | > show dbs |
3.更新数据
以下集合为例
1 | db.inventory.insertMany( [ |
更新单个文件
1 | db.inventory.updateOne( |
更新多个文件
1 | db.inventory.updateMany( |
更换文件
下面的示例替换集合中的第一个文档, inventory
其中:item: "paper"
1 | db.inventory.replaceOne( |
4.删除文件
以下集合为例
1 | db.inventory.insertMany( [ |
删除所有文件
1 | db.inventory.deleteMany({}) |
删除所有符合条件的文档
1 | db.inventory.deleteMany({ status : "A" }) |
仅删除一个符合条件的文档
1 | db.inventory.deleteOne( { status: "D" } ) |
1.4 创建索引
默认情况下,创建索引将阻止数据库上的所有其他操作。在集合上构建索引时,保存集合的数据库对于读取或写入操作是不可用的,直到索引构建完成。任何需要对所有数据库(例如listDatabases)进行读或写锁定的操作将等待前台索引构建完成。
对于可能需要长时间运行的索引创建操作,可以考虑background 选项,这样MongoDB 数据库在索引创建期间仍然是可用的。例如,在people 集合的zipcode 键上创建一个索引,这个过程在后台运行,可以使用如下方式:
db.people.createIndex( { zipcode: 1}, {background: true} )
默认MongoDB 索引创建的background 是false 。
索引优化: db.test.find({“id”:100}).explain()
1.查看执行计划
1 | db.test.find({"age":{ $lt: 30 }}).explain() |
2.创建索引
1 | db.test.createIndex( { age: 1 } ) |
3.查看索引
1 | db.test.getIndexes() |
4.再次查看执行计划
1 | 关键词 |
第2章 工具介绍
官网地址
1 | https://docs.mongodb.com/manual/reference/program/ |
MongoDB软件包中的核心组件是:mongod核心数据库进程;mongos分片集群的控制器和查询路由器; 以及 mongo交互式MongoDB Shell。
2.1 mongod
1 | Mongod 是Mongodb 系统的主要守护进程,它处理数据请求,管理数据访问,并执行后台 |
2.2 mongos
1 | mongos 对于“ MongoDB Shard”,是用于处理来自应用层的查询的MongoDB 分片配置的路由服务,并确 |
2.3 Mongostat
1 | Mongostat 实用程序可以快速概览当前正在运行的mongod 或mongos 实例的状态。mongostat 在功能上类似于UNIX / Linux 文件系统实用程序vmstat,但提供有关的数据mongod 和mongos 实例 |
2.4 Mongotop
1 | Mongotop 提供了一种跟踪MongoDB 实例读取和写入数据的时间量的方法。mongotop 提供每个收集级别 |
2.5 Mongooplog
1 | Mongooplog 是一个简单的工具,可以从远程服务器的复制oplog 轮询操作,并将其应用于本地服务器。此功能支持某些类型的实时迁移,这些迁移要求源服务器保持联机并在整个迁移过程中运行。通常,此命令将采用以下形式: |
第3章 授权认证
3.1 官方网址
1 | https://docs.mongodb.com/manual/reference/configuration-options/#security-options |
3.2 授权介绍
1 | 用户管理界面 |
操作命令
1 | db.auth() 将用户验证到数据库。 |
3.3 创建用户和角色
1.创建管理用户
1 | mongo db01:27017 |
2.查看创建的用户
1 | db.getUsers() |
3.配置文件添加权限认证参数
1 | security: #认证 |
4.重启mongo
1 | mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown |
5.登录
配置问权限认证后需要重启节点,再次登陆如果不使用账号密码就查看不了数据
1 | mongo db01:27017 -uadmin -p --authenticationDatabase admin |
6.创建其他用户
1 | use test |
7.创建测试数据
1 | use write |
8.退出admin,使用mysun用户登录
1 | mongo db01:27017 -umysun -p --authenticationDatabase test |
第4章 副本集配置
4.1 官方网站
1 | https://docs.mongodb.com/manual/replication/ |
在MongoDB中复制
副本集是一组mongod维护相同数据集的实例。一个副本集包含多个数据承载节点和一个仲裁器节点(可选)。在数据承载节点中,只有一个成员被视为主要节点,而其他节点则被视为次要节点。
所述主节点接收所有的写操作。副本集只能有一个能够确认与 写入有关的写入的主数据库。尽管在某些情况下,另一个mongod实例可能会暂时认为自己也是主要实例。 [1]主数据库在其操作日志(即oplog)中记录对其数据集的所有更改
该次级复制初级的OPLOG和应用操作的数据集,使得次级数据集反映了主要的数据集。如果主要节点不可用,则符合条件的次要节点将进行选举以自行选举新的主要节点。
您可以将一个额外的mongod
实例作为仲裁器添加到副本集 。仲裁者不维护数据集。仲裁程序的目的是通过响应其他副本集成员的心跳和选举请求来维护副本集中的仲裁。由于仲裁器不存储数据集,因此它是提供副本集仲裁功能且资源成本比具有数据集的功能齐全的副本集成员便宜的好方法。如果您的副本集成员数为偶数,请添加仲裁程序以majority
在主要选举中获得票数。仲裁器不需要专用硬件。
异步复制
辅助节点复制主节点的操作日志,并将操作异步应用于其数据集。通过使次要节点的数据集反映主要节点的数据集,即使一个或多个成员失败,副本集也可以继续运行。
复制延迟和流控制
复制滞后是指将主操作上的写操作复制(即复制)到辅助上所花费的时间 。可以接受一些小的延迟时间,但是随着复制滞后的增加会出现严重的问题,包括在主数据库上增加缓存压力。
从MongoDB 4.2开始,管理员可以限制主数据库应用其写入的速率,以将延迟保持在可配置的最大值以下。majority committed
flowControlTargetLagSeconds
默认情况下,流量控制为enabled
。
1 | #注意 |
自动故障转移
当主节点与集合中的其他成员的通信electionTimeoutMillis
时间超过配置的时间段(默认为10秒)时,合格的辅助节点将要求选举以提名自己为新的主节点。群集尝试完成新主数据库的选择并恢复正常操作。
4.2 创建多实例副本集
1.创建节点目录和数据目录
1 | mkdir -p /opt/mongo_2801{7,8,9}/{conf,logs,pid} |
2.创建配置文件
1 | cat >/opt/mongo_28017/conf/mongo_28017.conf <<EOF |
3.复制配置文件到其他节点
1 | cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28018/conf/mongo_28018.conf |
4.替换端口号
1 | sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongo_28018.conf |
5.启动所有节点
1 | mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown |
6.初始化集群
1 | mongo db01:28017 |
7.插入数据
1 | db.inventory.insertMany( [ |
8.副本节点登录查看数据
1 | mongo db01:28018 |
9.设置副本可读
1 | echo "rs.slaveOk();" > /root/.mongorc.js |
4.3 副本集权重调整
1.查看当前副本集配置
1 | rs.conf() |
2.设置权重
1 | config=rs.conf() |
3.主节点主动降级
1 | rs.stepDown() |
4.4 增加新节点和删除旧节点
1.创建新节点并启动
1 | mkdir /opt/mongo_28010/{conf,logs,pid} -p |
2.集群添加节点
1 | rs.add("db01:28010") |
3.删除节点
1 | rs.remove("db01:28010") |
4.5 仲裁节点
1.创建新节点并启动
1 | mkdir /opt/mongo_28011/{conf,logs,pid} -p |
2.将仲裁节点加入集群
1 | mongo db01:28018 |
第5章 mongo备份与恢复
1.工具介绍
1 | #(1)mongoexport/mongoimport |
2.应用场景
1 | 1.异构平台迁移 mysql <---> mongodb |
3.导出工具mongoexport
单表备份
1 | mongoexport --port 27017 -d test -c inventory -o /data/inventory.json |
单表备份至csv格式
1 | mongoexport --port 27017 -d test -c test --type=csv -f name,age,ad -o /data/test.csv |
4.恢复
1 | mongoimport --port 27017 -d test -c inventory /data/inventory.json |
5.mysql数据迁移到mongo
1 | select * from world.city into outfile '/data/city2.csv' fields terminated by ','; |
6.导出与恢复
1 | mongodump --port 27017 -o /data/backup |
7.模拟误删除恢复
1 | oplog |
8.Mongodump备份数据
1 | mongodump -h dbhost -d dbname -o dbdirectory |
9.Mongorestore恢复数据
1 | mongorestore -h dbhost -d dbname -directoryperdb dbdirectory |