MongoDB(二)mongo shell

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

  1. 在命令提示符下,進入到mongodb安裝目錄:
    cd <mongodb installation dir>
  2. 輸入./bin/mongo來啓動mongo:
    ./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命令。

  • db引用當前的數據庫
  • myCollection是當前collection的名字

若是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()

另外,你能夠使用下面明確的打印方法:

  • print()普通打印,不格式化。
  • print(tojson(<obj>)),json格式化,和printjson()等價。
  • printjson(),json格式化,和print(tojson(<obj>))。

更多有關查詢cursor的信息請看官方文檔。

多行操做

若是你在一行結束的時候使用左圓括號((),或者左花括號({),或者左方括號([),那麼下一行就會以省略號開頭直到你對應地輸入右括號。mongo shell會等待你輸入右括號,以下面的例子:

> if ( x > 0 ) {
... count++;
... print (x);
... }

若是連續兩行都是空行那麼就會退出等待模式:

> if (x > 0
...
...
>

tab鍵自動補全和其餘快捷鍵

mongo shell支持快捷鍵,例如:

  • 使用方向鍵上下箭頭能夠查看歷史命令
  • 使用tab鍵來自動補全,例如:
    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>來使用指定的編輯器,以下面的例子:

  1. 定義一個myFunction()函數:
    function myFunction () { }
  2. 使用自定義編輯器編輯這個函數:
    edit myFunction

    這條命令會打開vim會話,當編輯完畢後保存並退出vim會話。

  3. 在mongo shell裏,輸入myFunction來查看其定義:
    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命令:
    show dbs
  • 查看對於db對象可用的方法的列表,調用db.help()方法:
    db.help()
  • 查看shell中一個方法的實現,輸入db.<method name>不輸入圓括號,例以下面:
    db.updateUser

collection幫助

在mongo shell中:

  • 查看當前數據庫中collection的列表:
    show collections
  • 查看collection對象上可用的方法或者幫助:
    db.collection.help()

    此處的collection能夠是一個已存在的collection的名字,也能夠指定一個不存在的。

  • 查看collection方法的實現,輸入db.<collection>.<method>不輸入圓括號:
    db.collection.save

cursor幫助

當在mongo shell中經過find()發放執行read操做的時候,能夠使用多個cursor方法修改find()的行爲或者經過多個javascript方法去處理find()方法返回的cursor。

  • 輸入db.collection.find().help()來顯示全部可用的修改器和cursor處理方法:
    db.collection.find().help()
  • 輸入db.<collection>.find().<method>來查看方法的具體實現:
    db.collection.find().toArray

一些頗有用的cursor處理方法:

  • hasNext()檢查cursor是否有更多的document要返回
  • next()返回下一個document而且將cursor位置移向下一個
  • foreach(<function>)會重複整個cursor而且對於cursor返回的每個document應用一個函數,<function>有一個參數表明返回的document。

封裝類幫助

想要獲取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寫腳本的時候,考慮下面幾點:

  • 使用getDB()或者connect()方法來設置全局變量db。能夠設置數據庫引用到不是db的其餘變量上。
  • mongo shell裏的寫操做使用寫入安全級別{w:1}做爲默認值。若是要執行大量操做,就是用bulk()方法。
  • 在javascript文件裏不能使用任何shell語句,由於他們不是有效的javascript
    下面這張表格顯示了與mongo 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();
    //}
  • 在交互模式下,mongo打印操做的結果時會包含全部cursor的內容。在腳本里,要麼使用print()函數,要麼使用mongo明確的printjson()函數來返回格式化的JSON數據。
    在mongo shell腳本里想要打印全部項在一個結果cursor裏,使用下列語法:
    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()方法返回當前的date爲字符串形式
  • new Date()構造器返回Date對象被ISODate()包裹
  • ISODate()構造器返回Date對象被ISODate()包裹

在內部,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。

相關文章
相關標籤/搜索