MongoDB的Shell操作


前言

本文從介紹了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 使用之前定義的 vim 編輯器來編輯代碼。

示例代碼:

  1. 定義函數:
function myFunc () { }
  1. 使用指定的編輯器來編輯函數:
edit myFunc

此命令可以打開 Vim 編輯會話。當編輯完成之后,保存並退出編輯會話。

  1. 調用函數:

直接在 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 腳本的區別:

  1. 要使用db全局變量,請使用getDB()方法或connect()方法。可以將數據庫引用分配給非db以外的變量。
  2. 默認情況下,在mongo shell中的寫入操作使用寫入的{w:1}。如果執行批量操作,請使用Bulk()方法。
  3. 不能在JavaScript文件中使用任何shell 指令,因為它們不是有效的JavaScript,下文附對照表。
  4. 交互模式下,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提供了 instanceoftypeof 操作符。

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. .help() 顯示集合的操作文檔(集合可以是不存在的)
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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM