介紹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。