忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 徽章 文库 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 3035 | 回复: 0

[MongoDB] Mongo shell:最强大的 MongoDB 管理工具 [复制链接]

求职 : Linux运维
论坛徽章:
202
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
发表于 2017-01-22 13:50 |显示全部楼层
Mongo shell:最强大的 MongoDB 管理工具

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都会实现一个通用的执行命令的接口(mongodb的实现方式确实比较挫要用接口),然后再封装出一些常用的接口(比如常用的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-9555RIMARY> 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-9555RIMARY> 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-9555RIMARY> 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  
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的数据库管理系统,供用户免费使用。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP