本文從介紹了MongoShell 的配置、腳本、數據類型和其餘指令。html
MongoShell是一個互動的JavaScript接口的MongoDB,可使用MongoShell來查詢和更新數據以及執行管理操做。mongodb
MongoShell是MongoDB發行版的一個組件, 安裝並啓動MongoDB後,將MongoShell鏈接到正在運行的MongoDB實例,MongoDB手冊中的大多數示例使用 MongoShell,然而,許多驅動程序也提供了與MongoDB相似的接口。shell
在啓動MongoShell以前請確保MongoDB 實例在運行,在Terminal 中鍵入Mongo則能夠直接啓動。數據庫
示例代碼:json
➜ ~ mongo MongoDB shell version v3.4.3 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.3 Server has startup warnings: 2017-10-19T10:41:29.922+0800 I CONTROL [initandlisten] 2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten] > db.version() 3.4.3
當沒有任何參數運行mongo時,mongo shell將嘗試鏈接到端口27017上的localhost接口上運行的MongoDB實例。vim
若是須要連接非27017端口或者遠程實例,則可使用如下語法來連接:數組
mongo --username <user> --password <pass> --host <host> --port 28015
或者簡寫爲:服務器
mongo -u <user> -p <pass> --host <host> --port 28015
當啓動的時候,mongo檢查用戶HOME目錄下的一個JavaScript文件.mongorc.js
,若是找到mongo在首次顯示提示信息前解析.mongorc.js的內容。若是你使用shell執行一個JavaScript文件或計算表達式,要麼經過在命令行使用--eval選項或者指定一個.js文件給mongo,mongo會在完成JavaScript的處理後讀取.mongorc.js文件。你可使用--norc選項來阻止加載.mongorc.js。編輯器
測試數據:(這個 employee 對象是包含 3 個員工記錄的數組)函數
{ "employees":[ { "firstName":"Bill", "lastName":"Gates" }, { "firstName":"George", "lastName":"Bush" }, { "firstName":"Thomas", "lastName":"Carter" } ] }
> db test
> show dbs admin 0.000GB local 0.000GB > show databases admin 0.000GB local 0.000GB
使用show dbs
或者 show databases
能夠達到一樣的效果。
> use mydb switched to db mydb
能夠切換到一個不存在數據庫,當建立集合時,這個數據庫會被自動建立。
> db.emp.insertOne({x : 1}); { "acknowledged" : true, "insertedId" : ObjectId("59e87617052057c4236c259a") }
其中 db指的是當前的數據庫,emp 指的是要插入的集合的名稱。
> show collections emp
> db.emp.find() { "_id" : ObjectId("59e87617052057c4236c259a"), "x" : 1 }
要格式化打印結果,能夠將.pretty()添加到操做中,以下所示:
> db.emp.find().pretty() { "_id": ObjectId("59e87617052057c4236c259a"), "x": 1 }
此外,能夠在 mongo shell中使用下面的顯式打印方法:
若是你的代碼行以左括號 ('('
),左大括號 ('{'
)或左中括號 ('['
) 結束,那麼隨後的一行將以省略號 ("..."
) 開始,直到你輸入對應的右括號 (')'
),右大括號 ('}'
)或右中括號 (']'
) 。 mongoshell在執行代碼之前將一直等待右括號,右大括號或右中括號,以下例所示:
> if ( x > 0 ) { ... count++; ... print (x); ... }
也能夠經過按下兩次回車鍵來結束此次輸入:
> if (x > 0 ... ... >
在MongoShell中輸入quit()
或者按下 Ctrl+C
的組合鍵方式來結束 shell。
能夠經過在 MongoShell中設置變量 prompt 的值來修改提示符的內容。prompt 變量能夠存儲字符串以及JavaScript代碼。 若是 prompt 爲返回字符串的函數, mongo 則會在每一個提示符中展現動態信息。
顯示當前MongoShell 的操做數量,示例代碼:
cmdCount = 1; prompt = function() { return (cmdCount++) + "> "; }
配置好以後,提示符會變成這樣:
1> 2> 3>
示例代碼:
host = db.serverStatus().host; prompt = function() { return db+"@"+host+"$ "; }
提示符將會變成以下樣式:
test@HostName$
示例代碼:
prompt = function() { return "Uptime:"+db.serverStatus().uptime+" Documents:"+db.stats().objects+" > "; }
提示符將會變成以下樣式:
Uptime:90104 Documents:0 >
以上關於 prompt的相關配置都可以在 MongoShell中直接輸入配置,也能夠將其寫入再.mongorc.js
文件中。
能夠經過在啓動 MongoShell以前設置 EDITOR環境變量來在MongoShell中使用本身的編輯器。
➜ ~ export EDITOR=vim ➜ ~ mongo
進入MongoShell 以後,能夠輸入edit <function>使用以前定義的 vim 編輯器來編輯代碼。
示例代碼:
function myFunc () { }
edit myFunc
此命令能夠打開 Vim 編輯會話。當編輯完成以後,保存並退出編輯會話。
直接在 shell 中輸入函數名能夠查看函數體,輸入函數名() 能夠調用函數。
db.collection.find()
方法是從集合中檢索文檔的JavaScript方法。 db.collection.find()
方法返回一個遊標到結果;然而,在mongo shell中,若是返回的遊標未使用var關鍵字分配給變量,則光標自動迭代最多20次,以打印到與查詢匹配的前20個文檔。 mongo shell將提示鍵入它再次迭代20次。
能夠設置 DBQuery.shellBatchSize
屬性來修改默認的 20
篇文檔數。
示例代碼:
DBQuery.shellBatchSize = 10;
改成10。
咱們能夠在操做MongoDB中的數據或執行管理操做的JavaScript中爲mongo shell編寫腳本。
在MongoShell或者 JavaScript文件中,可使用 Mongo() 構造函數來實例化數據庫鏈接:
new Mongo() new Mongo(<host>) new Mongo(<host:port>)
考慮下面的示例,實例化一個到本機默認端口上運行的MongoDB實例的新鏈接,而且使用 getDB()方法將全局的 db
變量設置爲 myDatabase
:
conn = new Mongo(); db = conn.getDB("mydb");
若是鏈接到一個須要讀取控制的MongoDB實例,你可使用 db.auth()
方法進行受權。
此外,你可使用 connect()
方法鏈接到MongoDB實例。下面的示例 鏈接到運行在 localhost
非默認端口 27020
上的MongoDB實例,而且設置了全局的 db
變量:
db = connect("localhost:27020/mydb");
下表將最多見的mongo shell助手映射到JavaScript等效項:
Shell 指令 | JavaScript 操做方式 |
---|---|
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();} |
使用--eval選項來將mongo傳遞給一個JavaScript代碼片斷。
➜ ~ mongo mydb --eval "printjson(db.getCollectionNames())" MongoDB shell version v3.4.3 connecting to: mongodb://127.0.0.1:27017/mydb MongoDB server version: 3.4.3 [ "emp", "stores" ]
MongoShell 能夠 指定一個 .js 文件, mongo 將會直接運行JavaScript。
mongo localhost:27017/test myjsfile.js
該操做在鏈接到localhost
接口 27017
端口 mongod
實例上 test
database 的:program:mongo shell 中執行 myjsfile.js
腳本。
能夠在MongoShell中使用 load()
函數運行 .js文件,以下所示:
load("demo.js")
該函數導入並運行了 demo.js
文件。
load()
方法可接受相對路徑和絕對路徑。若是 mongo
shell 當前的工做目錄位於 /data/db
, 而文件demo.js
位於 /data/db/scripts
目錄,那麼下面兩種在 mongo
中的調用將會是一樣的效果。
load("scripts/myjstest.js") load("/data/db/scripts/demo.js")
MongoDB BSON提供了除 JSON以外其它數據類型的支持。 Drivers提供了對這些數據類型在主機語言的本地化支持,MongoShell 也提供了一些幫助類來支持這些數據類型在 mongo JavaScript shell 中的使用。
若是想要肯定字段類型,MongoShell提供了 instanceof
和 typeof
操做符。
instanceof 返回一個布爾值來驗證一個值是否爲某些類型的實例。
typeof 返回一個字段的類型。
MongoShell 提供了多種方法返回日期,要麼經過字符串要麼經過 Date 對象。
Date()
方法返回當前日期爲一個字符串。new Date()
構造函數返回一個使用 ISODate()
包裝返回的 Date
對象。ISODate()
構造函數返回一個使用 ISODate()
包裝返回的 Date
對象。內部來看, ref:document-bson-type-date 對象被存儲爲一個表示距離 Unix 紀元(1970年1月1日)毫秒數的64位整數,這就意味着一個可表示的日期範圍:從距離過去到未來的29億年。
若是想要返回日期爲一個字符串,使用 Date()
方法。
示例代碼:
1> var mydate = Date(); # 建立日期類型的變量 2> mydate # 查看變量的值 Mon Oct 23 2017 14:30:47 GMT+0800 (CST) 3> typeof(mydate) # 獲取查看變量的類型 string
MongoShell使用ISODate幫助程序包裝Date類型的對象。可是,對象仍然是Date類型。
1> var myDate = new Date(); 2> var myISODate = new ISODate(); 3> myDate ISODate("2017-10-23T06:59:56.039Z") 4> myISODate ISODate("2017-10-23T07:00:09.831Z") 5> myDate instanceof Date # 驗證類型 true 6> myISODate instanceof Date # 驗證類型 true
MongoShell圍繞ObjectId數據類型提供ObjectId()包裝器類。
示例代碼:
1> new ObjectId(); # 生成一個 ObjectId ObjectId("59ed998b6d3acf0e7aac525c")
默認狀況下,MongoShell將全部數字視爲浮點值(floating-point values)。MongoShell提供NumberLong()包裝器來處理64位整數。
示例代碼:
11> NumberLong("2090845886852") # NumberLong()包裝器接受long做爲字符串: NumberLong("2090845886852")
NumberInt() 構造函數來顯式指定 32位整數。
NumberDecimal()構造函數限制指定 128位 基於十進制的浮點值,可以以精確的精度仿效十進制近似值。 這個功能專爲處理 monetary data 的應用而設計,例如金融、稅務以及科學計算等。
可使用向上和向下箭頭鍵檢索MongoShell中發出的之前的命令。命令歷史存儲在~/.dbshell
文件中。
示例代碼:
cat ~/.dbshell
命令 | 說明 |
---|---|
help | 查看幫助 |
db.help() | 查看數據庫的操做幫助 |
db.<collection>.help() | 顯示集合的操做文檔(集合能夠是不存在的) |
show dbs | 顯示當前服務器上全部數據庫的列表 |
use <db> | 切換數據庫到 <db> (數據庫能夠是不存在的) |
show collections | 顯示當前數據庫的全部集合的列表 |
show users | 顯示當前數據庫的用戶列表 |
show roles | 顯示用於當前數據庫的用戶定義和內置的全部角色的列表。 |
show profile | 顯示最近的五個操做命令 |
show databases | 顯示全部可用數據庫列表。 |
load() | 加載執行JavaScript腳本文件 |
MongoShell 啓動時可使用一些選項。
選項 | 說明 |
---|---|
--help | 顯示命令行選項 |
--nodb | 啓動MongoShell而不鏈接到數據庫 |
--shell | 與 js 文件一塊兒使用 |
MongoDB 中文社區: http://www.mongoing.com/docs/mongo.html
MongoDB 官網文檔: https://docs.mongodb.com/manual/mongo/
MongoShell引用方法: https://docs.mongodb.com/manual/reference/method/