前言
本文從介紹了MongoShell 的配置、腳本、數據類型和其他指令。
MongoShell - 簡介
MongoShell是一個互動的JavaScript接口的MongoDB,可以使用MongoShell來查詢和更新數據以及執行管理操作。
MongoShell是MongoDB發行版的一個組件, 安裝並啟動MongoDB后,將MongoShell連接到正在運行的MongoDB實例,MongoDB手冊中的大多數示例使用 MongoShell,然而,許多驅動程序也提供了與MongoDB類似的接口。
啟動MongoShell:
在啟動MongoShell之前請確保MongoDB 實例在運行,在Terminal 中鍵入Mongo則可以直接啟動。
示例代碼:
➜ ~ 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實例。
鏈接選項:
如果需要鏈接非27017端口或者遠程實例,則可以使用以下語法來鏈接:
mongo --username <user> --password <pass> --host <host> --port 28015
或者簡寫為:
mongo -u <user> -p <pass> --host <host> --port 28015
.mongorc.js文件:
當啟動的時候,mongo檢查用戶HOME目錄下的一個JavaScript文件.mongorc.js
,如果找到mongo在首次顯示提示信息前解析.mongorc.js的內容。如果你使用shell執行一個JavaScript文件或計算表達式,要么通過在命令行使用--eval選項或者指定一個.js文件給mongo,mongo會在完成JavaScript的處理后讀取.mongorc.js文件。你可以使用--norc選項來阻止加載.mongorc.js。
使用MongoShell:
測試數據:(這個 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中使用下面的顯式打印方法:
- print() 無格式打印
- print(tojson(
)) 用 JSON 格式打印,等效於 printjson() - printjson() 用 JSON 格式打印,等效於 print(tojson(
))
shell 中的多行操作:
如果你的代碼行以左括號 ('('
),左大括號 ('{'
)或左中括號 ('['
) 結束,那么隨后的一行將以省略號 ("..."
) 開始,直到你輸入對應的右括號 (')'
),右大括號 ('}'
)或右中括號 (']'
) 。 mongoshell在執行代碼以前將一直等待右括號,右大括號或右中括號,如下例所示:
> if ( x > 0 ) {
... count++;
... print (x);
... }
也可以通過按下兩次回車鍵來結束這次輸入:
> if (x > 0
...
...
>
退出 shell 操作:
在MongoShell中輸入quit()
或者按下 Ctrl+C
的組合鍵方式來結束 shell。
MongoShell - 配置
自定義提示符:
可以通過在 MongoShell中設置變量 prompt 的值來修改提示符的內容。prompt 變量可以存儲字符串以及JavaScript代碼。 如果 prompt 為返回字符串的函數, mongo 則會在每個提示符中展示動態信息。
顯示當前Shell的操作數:
顯示當前MongoShell 的操作數量,示例代碼:
cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}
配置好之后,提示符會變成這樣:
1>
2>
3>
顯示數據庫和主機名:
示例代碼:
host = db.serverStatus().host;
prompt = function() {
return db+"@"+host+"$ ";
}
提示符將會變成如下樣式:
test@HostName$
顯示Mongo服務的啟動時間以及文檔數:
示例代碼:
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 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。
MongoShell - 腳本
我們可以在操作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");
交互式 shell 和mongo 腳本的區別:
- 要使用db全局變量,請使用getDB()方法或connect()方法。可以將數據庫引用分配給非db以外的變量。
- 默認情況下,在mongo shell中的寫入操作使用寫入的{w:1}。如果執行批量操作,請使用Bulk()方法。
- 不能在JavaScript文件中使用任何shell 指令,因為它們不是有效的JavaScript,下文附對照表。
- 交互模式下,mongo打印包含所有游標內容的操作結果。在腳本中,可以使用JavaScript的 print()函數或返回格式化的JSON的mongo specific printjson()函數。
下表將最常見的mongo shell助手映射到JavaScript等效項:
Shell 指令 | JavaScript 操作方式 |
---|---|
show dbs , show databases | db.adminCommand('listDatabases') |
use
|
db = db.getSiblingDB('
|
show collections | db.getCollectionNames() |
show users | db.getUsers() |
show roles | db.getRoles({showBuiltinRoles: true}) |
show log
|
db.adminCommand({ 'getLog' : '
|
show logs | db.adminCommand({ 'getLog' : '*' }) |
it | cursor = db.collection.find()if ( cursor.hasNext() ){ cursor.next();} |
--evel選項:
使用--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" ]
執行 JavaScript 文件:
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")
MongoShell - 數據類型
MongoDB BSON提供了除 JSON之外其它數據類型的支持。 Drivers提供了對這些數據類型在主機語言的本地化支持,MongoShell 也提供了一些幫助類來支持這些數據類型在 mongo JavaScript shell 中的使用。
檢查類型:
如果想要確定字段類型,MongoShell提供了 instanceof
和 typeof
操作符。
instanceof:
instanceof 返回一個布爾值來驗證一個值是否為某些類型的實例。
typeof:
typeof 返回一個字段的類型。
數據類型:
日期類型:
MongoShell 提供了多種方法返回日期,要么通過字符串要么通過 Date 對象。
Date()
方法返回當前日期為一個字符串。new Date()
構造函數返回一個使用ISODate()
包裝返回的Date
對象。ISODate()
構造函數返回一個使用ISODate()
包裝返回的Date
對象。
內部來看, ref:document-bson-type-date 對象被存儲為一個表示距離 Unix 紀元(1970年1月1日)毫秒數的64位整數,這就意味着一個可表示的日期范圍:從距離過去到將來的29億年。
返回string:
如果想要返回日期為一個字符串,使用 Date()
方法。
示例代碼:
1> var mydate = Date(); # 創建日期類型的變量
2> mydate # 查看變量的值
Mon Oct 23 2017 14:30:47 GMT+0800 (CST)
3> typeof(mydate) # 獲取查看變量的類型
string
返回Date:
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
ObjectId:
MongoShell圍繞ObjectId數據類型提供ObjectId()包裝器類。
示例代碼:
1> new ObjectId(); # 生成一個 ObjectId
ObjectId("59ed998b6d3acf0e7aac525c")
NumberLong:
默認情況下,MongoShell將所有數字視為浮點值(floating-point values)。MongoShell提供NumberLong()包裝器來處理64位整數。
示例代碼:
11> NumberLong("2090845886852") # NumberLong()包裝器接受long作為字符串:
NumberLong("2090845886852")
NumberInt:
NumberInt() 構造函數來顯式指定 32位整數。
NumberDecimal:
NumberDecimal()構造函數限制指定 128位 基於十進制的浮點值,能夠以精確的精度仿效十進制近似值。 這個功能專為處理 monetary data 的應用而設計,例如金融、稅務以及科學計算等。
MongoShell - 其他命令
歷史命令:
可以使用向上和向下箭頭鍵檢索MongoShell中發出的以前的命令。命令歷史存儲在~/.dbshell
文件中。
示例代碼:
cat ~/.dbshell
常用命令:
命令 | 說明 |
---|---|
help | 查看幫助 |
db.help() | 查看數據庫的操作幫助 |
db.
|
顯示集合的操作文檔(集合可以是不存在的) |
show dbs | 顯示當前服務器上所有數據庫的列表 |
use
|
切換數據庫到 <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/