http://blog.csdn.net/u011235983/article/details/9768179
mongo shell是MongoDB的交互式的JavaScript shell。我们可以用它来管理操作数据库,还可以用来运行JavaScript程序。下面介绍一些mongo shell的使用技巧,包括修改默认的提示符、在shell中使用外部编辑器和在mongo shell中使用快捷键。
mongo shell的提示符
在连接不同的节点时,mongo shell的提示符不一样:
-
单节点默认的提示符是:”>”;
-
复制集默认的提示符会显示复制集的名字和复制集的状态,比如:“replsetname:PRIMARY>”;
-
路由mongos默认的提示符是:”mongos>”
我们可以通过设置prompt变量来自定义提示符。在mongo shell中运行下面的代码就可以在mongo shell的提示符中显示数据库的名字和机器名:
- var host = db.serverStatus().host;
- var prompt = function() { return db+"@"+host+"> "; }
假设当前连接的是test数据库,提示符显示的是”local@hostname”,在切换数据库到local数据库后,显示就变成“local@hostname”了。
- test@hostname> use local
- switched to db local
- local@hostname>
如果我们需要在连接复制集时,既显示复制集的状态,又显示当前连接的数据库,可以使用下面的设置:(这个设置在连接主节点时,显示的是主节点所在的机器名)
- var host = db.serverStatus().host;
- states = ["STARTUP", "PRIMARY", "SECONDARY", "RECOVERING", "FATAL",
- "STARTUP2", "UNKNOWN", "ARBITER", "DOWN", "ROLLBACK"];
- var prompt = function() {
- result = db.isMaster();
- if (result.ismaster) {
- return db+"@"+host+"> ";
- }
- result = db.adminCommand({replSetGetStatus : 1})
- return states[result.myState]+":"+db+"> ";
- }
默认的提示符在连接mongos时,会显示”mongos>”,这有助于帮助我们了解当前连接的是一个集群。通过下面的设置我们可以在连接到mongos时,既显示当前连接的是mongos,又显示当前连接的数据库名:
- var prompt = function() {
- result = db.adminCommand({isdbgrid : 1});
- if (result.ok == 1) {
- return "mongos:"+db+"> ";
- }
- }
我们可以把上面的代码组合起来,设置成我们自定义的mongo shell的提示符:
- var host = db.serverStatus().host;
- states = ["STARTUP", "PRIMARY", "SECONDARY", "RECOVERING", "FATAL",
- "STARTUP2", "UNKNOWN", "ARBITER", "DOWN", "ROLLBACK"];
- var prompt = function() {
- result = db.adminCommand({isdbgrid : 1});
- if (result.ok == 1) {
- return "mongos:"+db+"> ";
- }
- result = db.isMaster();
- if (result.ismaster) {
- return db+"@"+host+"> ";
- }
- result = db.adminCommand({replSetGetStatus : 1})
- return states[result.myState]+":"+db+"> ";
- }
如果我们每次在进入mongo shell以后才运行上面的代码来自定义提示符会很麻烦,我们可以通过下面两种方式来简化:
- 把上面的代码存为shellConfig.js,在进入mongo shell后,运行load(“<path>/shellConfig.js”)就可以加载自定义的Shell提示符了。我们需要把<path>替换成shellConfig.js的路径。
- mongo在启动时会自动加载用户的home目录下的.mongorc.js文件,所以我们也可以把上面的代码存放到用户home目录下的.mongorc.js文件里。在每次启动mongo shell的时候,就会自动加载自定义的提示符。如果不需要加载自定义的提示符,我们可以在启动mongo shell时使用--norc选项。
mongo shell中使用外部编辑器
在前面的《MongoDB的聚合框架》的博客里,我们介绍了MongoDB的聚合操作的一个例子,如果我们在mongo shell里编写和调试这个聚合操作的命令,每次修改或编辑都比较困难。我们可以在运行mongo shell前设置EDITOR变量,在进入mongo shell后就能用edit命令来使用外部编辑器。
- bash-3.2$ export EDITOR=vim
- bash-3.2$ mongo
- MongoDB shell version: 2.4.5
- connecting to: test
- Server has startup warnings:
- Fri Aug 2 11:04:20.791 [initandlisten]
- Fri Aug 2 11:04:20.791 [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
- test@hostname> edit match
在编辑match变量时,我们可以用vim来编辑代码:
- {
- "$match" : {
- "posted" : {
- "$gte" : ISODate("2012-07-01T00:00:00Z")
- }
- }
- }
保存match变量并退出当前编辑器后,就能直接使用这个match变量了:
- test@hostname> db.articles.aggregate([ match ])
同理编辑unwind, group, sort, skip, limit, project这些变量,就可以运行例子里完整的聚合操作的命令:
- test@hostname> db.articles.aggregate([ match, unwind, group, sort, skip, limit, project])
- {
- "result" : [
- {
- "total" : 182,
- "tags" : "Solaris"
- },
- {
- "total" : 198,
- "tags" : "MongoDB"
- }
- ],
- "ok" : 1
- }
如果我们想要把查询的时间从2012年7月1号改成2012年8月1号,我们只需要修改match变量,就可以再次运行这个聚合操作:
- test@hostname> edit match
改为:
- {
- "$match" : {
- "posted" : {
- "$gte" : ISODate("2012-08-01T00:00:00Z")
- }
- }
- }
- test@hostname> db.articles.aggregate([ match, unwind, group, sort, skip, limit, project])
- {
- "result" : [
- {
- "total" : 162,
- "tags" : "Solaris"
- },
- {
- "total" : 162,
- "tags" : "MongoDB"
- }
- ],
- "ok" : 1
- }
mongo shell的快捷键
在mongo shell里,我们可以使用Tab键来自动补充命令,比如我们敲了”db.”的命令后,用Tab键就可以提示所有以”db.”开头的命令:
- test@hostname> db.
- db.Achievement db.forceError( db.groupeval( db.runCommand(
- db.addUser( db.fsyncLock( db.hasOwnProperty( db.serverBits(
- db.adminCommand( db.fsyncUnlock( db.help( db.serverBuildInfo(
- db.articles db.getCollection( db.hostInfo( db.serverCmdLineOpts(
- db.auth( db.getCollectionNames( db.isMaster( db.serverStatus(
- db.changeUserPassword( db.getLastError( db.killOP( db.setProfilingLevel(
- db.cloneCollection( db.getLastErrorCmd( db.killOp( db.setSlaveOk(
- db.cloneDatabase( db.getLastErrorObj( db.listCommands( db.shutdownServer(
- db.commandHelp( db.getMongo( db.loadServerScripts( db.stats(
- db.constructor db.getName( db.logout( db.system.indexes
- db.copyDatabase( db.getPrevError( db.printCollectionStats( db.system.profile
- db.createCollection( db.getProfilingLevel( db.printReplicationInfo( db.toLocaleString(
- db.currentOP( db.getProfilingStatus( db.printShardingStatus( db.toString(
- db.currentOp( db.getReplicationInfo( db.printSlaveReplicationInfo( db.tojson(
- db.dbEval( db.getSiblingDB( db.propertyIsEnumerable( db.user
- db.docs db.getSisterDB( db.prototype db.userResult
- db.dropDatabase( db.getSlaveOk( db.removeUser( db.valueOf(
- db.eval( db.group( db.repairDatabase( db.version(
- db.foo db.groupcmd( db.resetError(
此外,我们还可以用Ctrl+L或者cls命令来清屏,类似于Unix/Linux里的clear命令。更多的快捷键可以参考MongoDB的文档:http://docs.mongodb.org/manual/reference/program/mongo/#keyboard-shortcuts
参考文档:
http://docs.mongodb.org/manual/tutorial/getting-started-with-the-mongo-shell/
http://docs.mongodb.org/manual/faq/mongo/#faq-the-mongo-shell
http://www.kchodorow.com/blog/2011/06/27/ps1/