Mongo shell 是 MongoDB 的命令行管理工具,功能非常强大,最近社区很多人咨询的一些问题,比如
- 命令行看 json 格式比较吃力?
- 如何确定Secondary节点同步是否跟上?
- 怎么查看DB、集合使用了多少空间?
- 能否在shell 脚本里调用Mongo shell
- 怎么执行 MongoDB 命令,比如创建集合、索引?
- ……
上述问题都可以通过 Mongo shell 来解决,而且Mongo shell能做的远不止这些。
语法糖
为了方便关系型数据库的的用户切换到 MongoDB 上能快速上手,mongo shell里做了一些语法上的兼容(最终还是通过调用 MongoDB 的命令实现的 ),例如
show dbs 列出所有DB use dbname 切换当前DB show tables 或 show collections 列出当前DB的所有表/集合 show users 列出当前DB的所有用户 show profile 列出当前DB的所有慢查询 show logs 列出运行日志
执行命令
MongoDB的所有请求都以命令的形式发出,支持的命令列表参考Database Commands
基本所有的driver都会实现一个通用的执行命令的接口,然后再封装出一些常用的接口(比如常用的CRUD操作),mongo shell 通过 runCommand 接口来实现执行命令,例如执行 serverStatus 命令
* db.runCommand( { serverStatus: 1} )
mongo shell也对很对很多常用的命令进行了封装,让用户使用起来更简单。
常见的封装接口包括
* db.serverStatus() 查看mongod运行状态信息 * db.stats() 查看db元数据 * db.collection.stats() 查看集合元数据 * db.collection.insert() / update / remove / find 对集合增删改查 * db.collection.createIndex() 创建索引 * db.collection.dropIndex() 删除索引 * db.dropDatabase() 删除DB * db.printReplicationInfo() * db.printSlaveReplicationInfo() 查看复制集同步信息 * rs.status() 查看复制集当前状态 * rs.conf() 查看复制集配置 * rs.initiate() 初始化复制集 * rs.reconfig() 重新配置复制集 * rs.add() / rs.remove() 增加/删除复制集节点 * sh.enableSharding() 对DB启用分片 * sh.shardCollection() 对集合进行分片 * sh.status() 查看sharding状态信息 * ...
文档格式化输出
很多同学在使用 mongo shell时,觉得文档输出后可读性差,比如
mongo-9555:PRIMARY> db.collection1.find() // 对集合调用find时,默认输出前20个文档 { "_id" : ObjectId("587ed6ce098a4da78d508468"), "name" : "jack", "age" : 18, "sex" : "male", "hobbies" : [ "football", "basketball" ], "contact" : { "phone" : "10000123456", "address" : "hangzhou", "zipcode" : "31000" } }
实际上,mongo shell 可以对cursor的输出进行格式化(pretty)输出,JSON的文档会被格式化输出,可读性很强
mongo-9555:PRIMARY> db.collection1.find().pretty() { "_id" : ObjectId("587ed6ce098a4da78d508468"), "name" : "jack", "age" : 18, "sex" : "male", "hobbies" : [ "football", "basketball" ], "contact" : { "phone" : "10000123456", "address" : "hangzhou", "zipcode" : "31000" } }
mongo shell 里还可以通过 printjson
来格式化输出任意json对象,比如
mongo-9555:PRIMARY> printjson({ "_id" : ObjectId("587ed6ce098a4da78d508468"), "name" : "jack", "age" : 18, "sex" : "male", "hobbies" : [ "football", "basketball" ], "contact" : { "phone" : "10000123456", "address" : "hangzhou", "zipcode" : "310000000" } }) { "_id" : ObjectId("587ed6ce098a4da78d508468"), "name" : "jack", "age" : 18, "sex" : "male", "hobbies" : [ "football", "basketball" ], "contact" : { "phone" : "10000123456", "address" : "hangzhou", "zipcode" : "31000" }
shell脚本调用
mongo shell 除了支持交互式的调用方式,还能支持执行完一个或一批操作后自动退出,这样就能很方便的在shell 脚本里调用 mongo shell,比如获取 MongoDB 各个命令备调用的次数。
$ mongo --host localhost:27017 --eval "printjson( db.serverStatus().opcounters )" MongoDB shell version: 3.0.5 connecting to: localhost:27017/test { "insert" : 2, "query" : 13, "update" : 0, "delete" : 0, "getmore" : 74191, "command" : 104198 }
如果要一次执行很多个 MongoDB 的操作,可以将操作写到文件里,然后使用 mongo shell 批量执行
$cat test.js db = db.getSiblingDB("mydb") // 脚本里切换db的方式,相当于use mydb for (var i = 0; i < 100; i++) { db.collection.insert( {x: i} ) } printjson( {db.collection.count()} ) $ mongo --host localhost:27017 test.js MongoDB shell version: 3.0.5 connecting to: localhost:27017/test 100
mongo shell 还提供『启动时执行脚本』的机制,类似与linux shell里的启动新的shell时,执行~/.bashrc等文件的机制。
只要将脚本写入 ~/.mongorc.js 文件里, mongo shell 启动时,就会先执行这个脚本,例如
$cat .mongorc.js print("Welcome, ZhangYoudong"); 然后每次登录mongo shell时,这个文件的js脚本就会被执行 $ mongo --host localhost:27017 MongoDB shell version: 3.0.5 connecting to: localhost:27017/test Welcome, ZhangYoudong >
man 手册
上述的命令,并不需要去记忆,跟使用 linux shell 一样,需要用的时候看下 help 信息
* help * db.help() * rs.help() * sh.help() * db.collection.find().help() * help misc
除了上述功能,mongo shell 还提供了命令补全、命令历史等很多实用的功能,只要习惯了使用mongo shell,根本无需再使用图形界面来管理 MongoDB;当然为了方便更多用户,阿里云 MongoDB 云数据库 不仅支持通过mongo shell 及 其他第三方图形管理工具访问,还附带一个DMS的数据库管理系统,供用户免费使用。
未经允许不得转载:吾爱主机之家 » Mongo shell使用方法及操作指南