MongoDB的Shell操做

前言

本文從介紹了MongoShell 的配置、腳本、數據類型和其餘指令。html

MongoShell - 簡介

MongoShell是一個互動的JavaScript接口的MongoDB,可使用MongoShell來查詢和更新數據以及執行管理操做。mongodb

MongoShell是MongoDB發行版的一個組件, 安裝並啓動MongoDB後,將MongoShell鏈接到正在運行的MongoDB實例,MongoDB手冊中的大多數示例使用 MongoShell,然而,許多驅動程序也提供了與MongoDB相似的接口。shell

啓動MongoShell:

在啓動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

.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(<obj>)) 用 JSON 格式打印,等效於 printjson()
  • printjson() 用 JSON 格式打印,等效於 print(tojson(<obj>))

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>使用以前定義的 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 = 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();}

--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.<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/

相關文章
相關標籤/搜索