博文转载地址: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的提示符中显示数据库的名字和机器名:
[javascript] view plain copy
var host = db.serverStatus().host;
var prompt = function() { return db+"@"+host+"> "; }
假设当前连接的是test数据库,提示符显示的是”local@hostname”,在切换数据库到local数据库后,显示就变成“local@hostname”了。
[javascript] view plain copy
test@hostname> use local
switched to db local
local@hostname>
如果我们需要在连接复制集时,既显示复制集的状态,又显示当前连接的数据库,可以使用下面的设置:(这个设置在连接主节点时,显示的是主节点所在的机器名)
[javascript] view plain copy
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,又显示当前连接的数据库名:
[javascript] view plain copy
var prompt = function() {
result = db.adminCommand({isdbgrid : 1});
if (result.ok == 1) {
return "mongos:"+db+"> ";
}
}
我们可以把上面的代码组合起来,设置成我们自定义的mongo shell的提示符:
[javascript] view plain copy
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(“
mongo在启动时会自动加载用户的home目录下的.mongorc.js文件,所以我们也可以把上面的代码存放到用户home目录下的.mongorc.js文件里。在每次启动mongo shell的时候,就会自动加载自定义的提示符。如果不需要加载自定义的提示符,我们可以在启动mongo shell时使用--norc选项。
mongo shell中使用外部编辑器
在前面的《MongoDB的聚合框架》的博客里,我们介绍了MongoDB的聚合操作的一个例子,如果我们在mongo
shell里编写和调试这个聚合操作的命令,每次修改或编辑都比较困难。我们可以在运行mongo shell前设置EDITOR变量,在进入mongo shell后就能用edit命令来使用外部编辑器。
[javascript] view plain copy
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来编辑代码:
[javascript] view plain copy
{
"$match" : {
"posted" : {
"$gte" : ISODate("2012-07-01T00:00:00Z")
}
}
}
保存match变量并退出当前编辑器后,就能直接使用这个match变量了:
[javascript] view plain copy
test@hostname> db.articles.aggregate([ match ])
同理编辑unwind, group, sort, skip, limit, project这些变量,就可以运行例子里完整的聚合操作的命令:
[javascript] view plain copy
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变量,就可以再次运行这个聚合操作:
[javascript] view plain copy
test@hostname> edit match
改为:
[javascript] view plain copy
{
"$match" : {
"posted" : {
"$gte" : ISODate("2012-08-01T00:00:00Z")
}
}
}
[javascript] view plain copy
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.”开头的命令:
[javascript] view plain copy
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/