介绍javascript
mongo shell是一个mongoDB的javascript交互接口。你能够使用mongo shell查询和更新数据,也能够执行管理员操做。java
mongo shell是mongoDB的组件,一旦你安装而且启动了mongoDB,你就能够链接mongo shell到mongoDB实例。mongodb
启动mongo shellshell
注意:在试图启用mongo shell前先保证mongoDB已经运行。数据库
去开启mongo shell而且链接到运行在本地的默认端口的mongoDB:json
cd <mongodb installation dir>
./bin/mongo
若是你将mongo的路径添加到了系统PATH环境变量里面,那么就能够直接输入mongo来代替./bin/mongo。vim
选项安全
若是你在运行mongo的时候没有使用参数,那么mongo shell会尝试链接运行在本地的默认端口27017的mongoDB实例,也能够指定其余域名和端口号,还有更多其余参数,请去查阅mongo手册。服务器
.mongorc.js文件app
当启动mongo的时候程序会检查用户的home目录去寻找一个叫作.mongorc.js的文件。若是找到这个文件,mongo会在发出提示以前解释这个文件的内容。若是你想使用mongo shell来对一个javescript文件或者表达式求值,要么使用--eval选项要么指定一个js文件。mongo会在这个js文件或者表达式完成解析以后才去读取.mongorc.js。你能够使用--norc选项来阻止程序读取.mongorc.js文件。
使用mongo shell工做
显示当前正在使用的数据库,使用以下命令:
db
会返回test这个默认的数据库,想切换数据库,使用use <database>:
use <database>
使用show dbs来列出可用的数据库。db.getSiblingDB()方法能够不切换当前数据库环境来获取一个不一样的数据库。
你也能够切换到不存在的数据库上去。当你首次在数据库存储数据的时候,例如建立一个collection的时候(collection是一组document,等同于关系数据库的table,document是mongodb的最基本的数据单位),mongoDB就会自动建立这个数据库。下面这个例子会经过inserOne()操做来建立名为myNewDatabase的数据库和名为myCollection的collection:
use myNewDatabase
db.myCollection.insertOne( { x: 1 } );
db.myCollection.insertOne()是一条可用的mongo shell命令。
若是mongo shell不能接受collection的名字,你能够使用可选的db.getCollection()语法。好比,当一个collection的名字中包含了空格或者连字符,或者以一个数字开头,又或者与一个原生的函数名称冲突:
db.getCollection("3 test").find() db.getCollection("3-test").find() db.getCollection("stats").find()
每一行mongo shell 限制只能有4095个完整的unicode字符。若是你在一行内输入超过了这个限制,那么shell会触发truncate操做。
想要了解更多的mongo shell操做,请去查看官方文档。
格式化打印结果
db.collection.find()方法返回结果的cursor。在mongo shell里,若是返回的cursor没有指派给使用var关键字的变量,随后cursor会自动重复20次来打印最初匹配的20条document。mongo shell会提示Type it来重复另外20次。
在命令后面加上.pretty()能够格式化结果。
db.myCollection.find().pretty()
另外,你能够使用下面明确的打印方法:
更多有关查询cursor的信息请看官方文档。
多行操做
若是你在一行结束的时候使用左圆括号((),或者左花括号({),或者左方括号([),那么下一行就会以省略号开头直到你对应地输入右括号。mongo shell会等待你输入右括号,以下面的例子:
> if ( x > 0 ) { ... count++; ... print (x); ... }
若是连续两行都是空行那么就会退出等待模式:
> if (x > 0 ... ... >
tab键自动补全和其余快捷键
mongo shell支持快捷键,例如:
db.myCollection.c<Tab>
由于有不少方法起始字母都是c,因此会列出多个方法。
退出shell
退出shell模式,输入quit()或者使用快捷键ctrl + c
定制提示符
能够经过设置prompt变量来修改提示符的内容。prompt变量能够是字符串也能够是javascript代码。若是它是一个返回字符串的函数,那么每一次提示都会是动态消息。
你能够在.mongorc.js文件里为提示添加逻辑用来在每一次启动mongo shell的时候设置提示符。
定制提示符来显示操做的序号
建立一个拥有当前会话的操做的序号的mongo shell提示符,在mongo shell中定义以下变量:
cmdCount = 1; prompt = function() { return (cmdCount++) + "> "; }
提示符就会相似下面这样:
1> 2> 3>
定制提示符来显示数据库和域名
建立一个类如<database>@<hostname>形式的mongo shell提示,定义以下变量:
host = db.serverStatus().host; prompt = function() { return db+"@"+host+"$ "; }
提示符就会以下所示:
test@myHost1$
定制提示符显示时间和document计数
建立一个包含系统时间和当前数据库中document的数量的提示符,就定义以下变量:
prompt = function() { return "Uptime:"+db.serverStatus().uptime+" Documents:"+db.stats().objects+" > "; }
提示符就会相似下面这样:
Uptime:5897 Documents:6 >
在mongo shell中使用外部编辑器
在启动mongo shell前能够经过设置EDITOR环境变量来在mongo shell中使用你本身想用的编辑器。
export EDITOR=vim
mongo
一旦进入了mongo shell,你能够输入edit <variable> 或者 edit<function>来使用指定的编辑器,以下面的例子:
function myFunction () { }
edit myFunction
这条命令会打开vim会话,当编辑完毕后保存并退出vim会话。
myFunction
结果会显示编辑后的变化:
function myFunction() { print("This was edited"); }
当在外部编辑器编辑代码的时候,函数里的代码可能会被修改,取决于javascrip编译器。对mongo来讲可能会把1+1变成2或者去除注释。真正的变化只是代码的表面这会由于javascript的版本而改变可是不会改变代码的语义。
改变一次find()查询结果的数量
db.collection.find()方法返回结果的cursor。在mongo shell里,若是返回的cursor没有指派给使用var关键字的变量,随后cursor会自动重复20次来打印最初匹配的20条document。mongo shell会提示Type it来重复另外20次。
能够设置DBQuery.shellBatchSize属性来改变结果的默认数量20,下面的例子将其改成10:
DBQuery.shellBatchSize = 10;
命令行帮助
查看选项列表和开启mongo shell的帮助,在命令行里使用--help选项:
mongo --help
shell帮助
在mongo shell之中查看帮助,输入help:
help
数据库帮助
在mongo shell中:
show dbs
db.help()
db.updateUser
collection帮助
在mongo shell中:
show collections
db.collection.help()
此处的collection能够是一个已存在的collection的名字,也能够指定一个不存在的。
db.collection.save
cursor帮助
当在mongo shell中经过find()发放执行read操做的时候,能够使用多个cursor方法修改find()的行为或者经过多个javascript方法去处理find()方法返回的cursor。
db.collection.find().help()
db.collection.find().toArray
一些颇有用的cursor处理方法:
封装类帮助
想要获取mongo shell中可用的封装类的列表,例如BinData(),输入help misc:
help misc
打开新链接
经过mongo shell或者一个javascript文件,你能够使用mongo()构造器实例化数据库链接:
new Mongo() new Mongo(<host>) new Mongo(<host:port>)
思考下面这个例子,使用getDB()方法在默认端口的localhost上实例化mongoDB实例而且设置全局变量db的值为myDatabase:
conn = new Mongo(); db = conn.getDB("myDatabase");
若是链接到一个mongoDB实例会强制执行访问控制,能够使用db.auth()方法来使之生效。
另外,能够使用connect()方法去链接mongoDB实例。下面的例子链接到了一个运行在localhost上非默认端口27020上的mongoDB实例而且设置了全局变量db:
db = connect("localhost:27020/myDatabase");
交互式mongo和脚本式mongo的区别
当为mongo shell写脚本的时候,考虑下面几点:
show dbs, show databases //db.adminCommand('listDatabases') use <db> //db = db.getSiblingDB('<db>') show collections //db.getCollectionNames() show users //db.getUsers() show roles //db.getRoles({showBuiltinRoles: true}) show log <logname> //db.adminCommand({ 'getLog' : '<logname>' }) show logs //db.adminCommand({ 'getLog' : '*' }) it //cursor = db.collection.find() //if ( cursor.hasNext() ){ // cursor.next(); //}
cursor = db.collection.find(); while ( cursor.hasNext() ) { printjson( cursor.next() ); }
脚本
在系统命令提示符中,想要执行javascript:
--eval 选项
在mongo shell里使用--eval选项传递一条javascript代码片断,以下所示:
mongo test --eval "printjson(db.getCollectionNames())"
This returns the output of db.getCollectionNames()
using the mongo
shell connected to the mongod
ormongos
instance running on port 27017
on the localhost
interface.
这段代码会使用shell链接运行在默认27017端口上的localhost上的mongod或者mongos返回db.getCollectionNames()的结果。
执行一个javascript文件
你能够为mongo shell指定一个js文件,mongo会当即执行这个js文件,看下面的例子:
mongo localhost:27017/test myjsfile.js
这段操做经过一个链接到test数据库的mongod实例执行了myjsfile.js文件,这个实例运行在localhost端口27017。
你还能够用另外一种方法,能够在js文件里使用Mongo()构造器来指定mongodb的链接参数。
能够在shell里使用load()函数,来执行一个js文件:
load("myjstest.js")
load()方法会接受相对路径和绝对路径。若是当前的mongo shell工做目录在/data/db,而myjstest.js在/data/db/scripts目录下,那么下面的操做是等价的:
load("scripts/myjstest.js")
load("/data/db/scripts/myjstest.js")
数据类型
mongodb BSON提供了对于JSON以外的数据类型的支持。driver对这些数据类型在宿主语言中提供了原生支持,mongo shell还提供了几个helper类在javascript shell中支持这些数据类型。
BSON,是一个序列化格式用于储存document而且在mongodb中进行远程程序调用。
Date
mongo shell提供了多种方法来返回日期类型数据date,能够返回字符串也能够返回对象。
在内部,Date对象被存储为有符号的64位整型,表明了自从unix时间戳(1970年1月1日)起的毫秒数。
并非全部的数据库操做和driver都支持完整的64位范围。能够安全地使用不超过0到9999年份范围的date数据。
返回date做为字符串格式
Date()方法返回字符串格式的date:
var myDateString = Date();
输入变量名字以查看其中存的值:
myDateString
Wed Dec 19 2012 01:03:25 GMT-0500 (EST)
使用typeof操做符来核实变量的类型:
typeof myDateString string
返回Date
mongo shell会使用ISODate来包裹Date类型的对象。然而,对象会留下类型Date。
下面的例子使用了new Date()构造器,也使用了ISODate构造器来返回Date对象。
var myDate = new Date(); var myDateInitUsingISODateWrapper = ISODate();
你也能够在使用ISODate的时候使用new操做符。
打印myDate的值,它被包裹在ISODate中:
myDate
ISODate("2012-12-19T06:01:17.171Z")
使用instanceof操做符来核实类型:
myDate instanceof Date myDateInitUsingISODateWrapper instanceof Date
它们都返回了true。