mongo Shell的使用小技巧

mongo Shell的使用小技巧


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以后才运行上面的代码来自定义提示符会很麻烦,我们可以通过下面两种方式来简化:

  1. 把上面的代码存为shellConfig.js,在进入mongo shell后,运行load(“<path>/shellConfig.js”)就可以加载自定义的Shell提示符了。我们需要把<path>替换成shellConfig.js的路径。
  2. 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/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值