当前位置: 主机百科 » 资源 » 技术 » 正文

Mongo shell使用方法及操作指南

Mongo shell 是 MongoDB 的命令行管理工具,功能非常强大,最近社区很多人咨询的一些问题,比如

  • 命令行看 json 格式比较吃力?
  • 如何确定Secondary节点同步是否跟上?
  • 怎么查看DB、集合使用了多少空间
  • 能否在shell 脚本里调用Mongo shell
  • 怎么执行 MongoDB 命令,比如创建集合、索引?
  • ……

上述问题都可以通过 Mongo shell 来解决,而且Mongo shell能做的远不止这些。

语法糖

为了方便关系型数据库的的用户切换到 MongoDB 上能快速上手,mongo shell里做了一些语法上的兼容(最终还是通过调用 MongoDB 的命令实现的 ),例如

1
<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> dbs     列出所有DB  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>use</span> dbname   切换当前DB  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>tables</span>   <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> collections  列出当前DB的所有表/集合  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>users</span>   列出当前DB的所有用户  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> profile 列出当前DB的所有慢查询  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>show</span> <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>logs</span>     列出运行日志  

执行命令

MongoDB的所有请求都以命令的形式发出,支持的命令列表参考Database Commands

基本所有的driver都会实现一个通用的执行命令的接口,然后再封装出一些常用的接口(比如常用的CRUD操作),mongo shell 通过 runCommand 接口来实现执行命令,例如执行 serverStatus 命令

1
* <span class=“hljs-selector-tag” style=“box-sizing: border-box;”>db</span><span class=“hljs-selector-class” style=“box-sizing: border-box;”>.runCommand</span>( { <span class=“hljs-attribute” style=“box-sizing: border-box; color: rgb(102, 217, 239);”>serverStatus</span>: <span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>1</span>} )    

mongo shell也对很对很多常用的命令进行了封装,让用户使用起来更简单

常见的封装接口包括

1
<span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.serverStatus()                                查看mongod运行状态信息  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.stats()                                       查看db元数据  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.collection.stats()                            查看集合元数据  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.collection.insert() / update / remove / find  对集合增删改查  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.collection.createIndex()                      创建索引  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.collection.dropIndex()                        删除索引  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.dropDatabase()                                删除DB  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.printReplicationInfo()   <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>db.printSlaveReplicationInfo()                   查看复制集同步信息  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>rs.status()                                      查看复制集当前状态  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>rs.conf()                                        查看复制集配置  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>rs.initiate()                                    初始化复制集  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>rs.reconfig()                                    重新配置复制集  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>rs.add() / rs.remove()                           增加/删除复制集节点    <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>sh.enableSharding()                              DB启用分片  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>sh.shardCollection()                             对集合进行分片  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>sh.status()                                      查看sharding状态信息  <span class=“hljs-bullet” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>* </span>...  

文档格式化输出

很多同学在使用 mongo shell时,觉得文档输出后可读性差,比如

1
mongo<span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>9555</span>:PRIMARY&gt; db<span class=“hljs-selector-class” style=“box-sizing: border-box;”>.collection1</span><span class=“hljs-selector-class” style=“box-sizing: border-box;”>.find</span>() <span class=“hljs-comment” style=“box-sizing: border-box; color: rgb(117, 113, 94);”>// 对集合调用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的文档会被格式化输出,可读性很强

1
mongo<span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>9555</span>:PRIMARY&gt; db<span class=“hljs-selector-class” style=“box-sizing: border-box;”>.collection1</span><span class=“hljs-selector-class” style=“box-sizing: border-box;”>.find</span>().pretty()  {      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;_id&quot;</span> : ObjectId(<span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;587ed6ce098a4da78d508468&quot;</span>),      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;name&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;jack&quot;</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;age&quot;</span> : <span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>18</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;sex&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;male&quot;</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hobbies&quot;</span> : [          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;football&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;basketball&quot;</span>      ],      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;contact&quot;</span> : {          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;phone&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;10000123456&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;address&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hangzhou&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;zipcode&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;31000&quot;</span>      }  }  

mongo shell 里还可以通过 printjson 来格式化输出任意json对象,比如

1
mongo<span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>9555</span>:PRIMARY&gt; printjson({ <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;_id&quot;</span> : ObjectId(<span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;587ed6ce098a4da78d508468&quot;</span>), <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;name&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;jack&quot;</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;age&quot;</span> : <span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>18</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;sex&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;male&quot;</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hobbies&quot;</span> : [ <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;football&quot;</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;basketball&quot;</span> ], <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;contact&quot;</span> : { <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;phone&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;10000123456&quot;</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;address&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hangzhou&quot;</span>, <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;zipcode&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;310000000&quot;</span> } })  {      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;_id&quot;</span> : ObjectId(<span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;587ed6ce098a4da78d508468&quot;</span>),      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;name&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;jack&quot;</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;age&quot;</span> : <span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>18</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;sex&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;male&quot;</span>,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hobbies&quot;</span> : [          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;football&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;basketball&quot;</span>      ],      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;contact&quot;</span> : {          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;phone&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;10000123456&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;address&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;hangzhou&quot;</span>,          <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;zipcode&quot;</span> : <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;31000&quot;</span>      }  

shell脚本调用

mongo shell 除了支持交互式的调用方式,还能支持执行完一个或一批操作后自动退出,这样就能很方便的在shell 脚本里调用 mongo shell,比如获取 MongoDB 各个命令备调用的次数。

1
$ mongo <span class=“hljs-comment” style=“box-sizing: border-box; color: rgb(117, 113, 94);”>host localhost:27017 eval &quot;printjson( db.serverStatus().opcounters )&quot;</span>  MongoDB shell version: <span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>3.0</span>.<span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>5</span>  connecting to: localhost:<span class=“hljs-number” style=“box-sizing: border-box; color: rgb(174, 129, 255);”>27017</span>/test  {      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;insert&quot;</span> : 2,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;query&quot;</span> : 13,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;update&quot;</span> : 0,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;delete&quot;</span> : 0,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;getmore&quot;</span> : 74191,      <span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;command&quot;</span> : 104198  }  

如果要一次执行很多个 MongoDB 的操作,可以将操作写到文件里,然后使用 mongo shell 批量执行

1
<span class=“hljs-variable” style=“box-sizing: border-box;”>$cat</span> <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>test</span>.js  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>db</span> = <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>db</span>.getSiblingDB(<span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;mydb&quot;</span>)   <span class=“hljs-comment” style=“box-sizing: border-box; color: rgb(117, 113, 94);”>// 脚本里切换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 启动时,就会先执行这个脚本,例如

1
<span class=“hljs-variable” style=“box-sizing: border-box;”>$cat</span> .mongorc.js  <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>print</span>(<span class=“hljs-string” style=“box-sizing: border-box; color: rgb(230, 219, 116);”>&quot;Welcome, ZhangYoudong&quot;</span>);    然后每次登录mongo <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>shell</span>时,这个文件的js脚本就会被执行    $ mongo host localhost:27017  MongoDB <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>shell</span> <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>version</span>: 3.0.5  connecting to: localhost:27017/<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>test</span>  Welcome, ZhangYoudong  &gt;  

man 手册

上述的命令,并不需要去记忆,跟使用 linux shell 一样,需要用的时候看下 help 信息

1
* <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span>  * db.<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span>()  * rs.<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span>()  * <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>sh</span>.<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span>()   * db.collection.<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>find</span>().<span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span>()  * <span class=“hljs-keyword” style=“box-sizing: border-box; color: rgb(249, 38, 114);”>help</span> misc  

除了上述功能,mongo shell 还提供了命令补全、命令历史等很多实用的功能,只要习惯了使用mongo shell,根本无需再使用图形界面来管理 MongoDB;当然为了方便更多用户阿里云 MongoDB 云数据库 不仅支持通过mongo shell 及 其他第三方图形管理工具访问,还附带一个DMS的数据库管理系统,供用户免费使用。

未经允许不得转载:主机百科 » Mongo shell使用方法及操作指南

相关文章