国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MongoDB指南---4、MongoDB基礎知識-使用MongoDB Shell

wujl596 / 1186人閱讀

摘要:也可以在中使用函數來執行命令行程序。注意,這種方式并不能保護數據庫免受惡意用戶的攻擊,只能預防自己的手誤。必須使用語法才能將解釋為相應的變量。上一篇文章指南基礎知識數據類型下一篇文章指南創建刪除文檔

上一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型
下一篇文章:MongoDB指南---5、創建、刪除文檔

本節將介紹如何將shell作為命令行工具的一部分來使用,如何對shell進行定制,以及shell的一些高級功能。
在上面的例子中,我們只是連接到了一個本地的mongod實例。事實上,可以將shell連接到任何MongoDB實例(只要你的計算機與MongoDB實例所在的計算機能夠連通)。在啟動shell時指定機器名和端口,就可以連接到一臺不同的機器(或者端口):

$ mongo some-host:30000/myDB
MongoDB shell version: 2.4.0
connecting to: some-host:30000/myDB

db現在就指向了some-host:30000上的myDB數據庫。
啟動mongo shell時不連接到任何mongod有時很方便。通過--nodb參數啟動shell,啟動時就不會連接任何數據庫:

$ mongo --nodb
MongoDB shell version: 2.4.0
>

啟動之后,在需要時運行new Mongo(hostname)命令就可以連接到想要的mongod了:

> conn = new Mongo("some-host:30000")
connection to some-host:30000
> db = conn.getDB("myDB")
myDB

執行完這些命令之后,就可以像平常一樣使用db了。任何時候都可以使用這些命令來連接到不同的數據庫或者服務器。

2.7.1 shell小貼士

由于mongo是一個簡化的JavaScript shell,可以通過查看JavaScript的在線文檔得到大量幫助。對于MongoDB特有的功能,shell內置了幫助文檔,可以使用help命令查看:

> help
    db.help()             help on db methods
    db.mycoll.help()      help on collection methods
    sh.help() sharding    helpers
    ...

    show dbs show database names
    show collections show collections in current database
    show users show users in current database
    ...

可以通過db.help()查看數據庫級別的幫助,使用db.foo.help()查看集合級別的幫助。
如果想知道一個函數是做什么用的,可以直接在shell輸入函數名(函數名后不要輸入小括號),這樣就可以看到相應函數的JavaScript實現代碼。例如,如果想知道update函數的工作機制,或者是記不清參數的順序,就可以像下面這樣做:

> db.foo.update
function (query, obj, upsert, multi) {
    assert(query, "need a query");
    assert(obj, "need an object");
    this._validateObject(obj);
    this._mongo.update(this._fullName, query, obj,
                       upsert ? true : false, multi ? true : false);
} 
2.7.2 使用shell執行腳本

本書其他章都是以交互方式使用shell,但是也可以將希望執行的JavaScript文件傳給shell。直接在命令行中傳遞腳本就可以了:

$ mongo script1.js script2.js script3.js
MongoDB shell version: 2.4.0
connecting to: test
I am script1.js
I am script2.js
I am script3.js
$

mongo shell會依次執行傳入的腳本,然后退出。
如果希望使用指定的主機/端口上的mongod運行腳本,需要先指定地址,然后再跟上腳本文件的名稱:

$ mongo --quiet server-1:30000/foo script1.js script2.js script3.js

這樣可以將db指向server-1:30000上的foo數據庫,然后執行這三個腳本。如上所示,運行shell時指定的命令行選項要出現在地址之前。
可以在腳本中使用print()函數將內容輸出到標準輸出(stdout),如上面的腳本所示。這樣就可以在shell中使用管道命令。如果將shell腳本的輸出管道給另一個使用--quiet選項的命令,就可以讓shell不打印“MongoDB shell version…”提示。
也可以使用load()函數,從交互式shell中運行腳本:

> load("script1.js") 
I am script1.js
>

在腳本中可以訪問db變量,以及其他全局變量。然而,shell輔助函數(比如"use db"和"show collections")不可以在文件中使用。這些輔助函數都有對應的JavaScript函數,如表2-1所示。
表2-1 shell輔助函數對應的JavaScript函數

輔助函數 等價函數
use foo db.getSisterDB("foo")
show dbs db.getMongo().getDBs()
show collections db.getCollectionNames()

可以使用腳本將變量注入到shell。例如,可以在腳本中簡單地初始化一些常用的輔助函數。例如,下面的腳本對于本書的復制和分片部分內容非常有用。這個腳本定義了一個connectTo()函數,它連接到指定端口處的一個本地數據庫,并且將db指向這個連接。

// defineConnectTo.js 

/**
 * 連接到指定的數據庫,并且將db指向這個連接
 */
var connectTo = function(port, dbname) {
    if (!port) {
        port = 27017;
    }

    if (!dbname) {
        dbname = "test";
    }

    db = connect("localhost:"+port+"/"+dbname);
    return db;
};

如果在shell中加載這個腳本,connectTo函數就可以使用了。

> typeof connectTo
undefined
> load("defineConnectTo.js")
> typeof connectTo
function

除了添加輔助函數,還可以使用腳本將通用的任務和管理活動自動化。
默認情況下,shell會在運行shell時所處的目錄中查找腳本(可以使用run("pwd")命令查看)。如果腳本不在當前目錄中,可以為shell指定一個相對路徑或者絕對路徑。例如,如果腳本放置在~/my-scripts目錄中,可以使用load("/home/myUser/my-scripts/defineConnectTo.js")命令來加載defineConnectTo.js。注意,load函數無法解析~符號。
也可以在shell中使用run()函數來執行命令行程序。可以在函數參數列表中指定程序所需的參數:

> run("ls", "-l", "/home/myUser/my-scripts/")
sh70352| -rw-r--r-- 1 myUser myUser 2012-12-13 13:15 defineConnectTo.js
sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:10 script1.js
sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:12 script2.js
sh70532| -rw-r--r-- 1 myUser myUser 2013-02-22 15:13 script3.js

通常來說,這種使用方式的局限性非常大,因為輸出格式很奇怪,而且不支持管道。

2.7.3 創建.mongorc.js文件

如果某些腳本會被頻繁加載,可以將它們添加到mongorc.js文件中。這個文件會在啟動shell時自動運行。
例如,我們希望啟動成功時讓shell顯示一句歡迎語。為此,我們在用戶主目錄下創建一個名為.mongorc.js的文件,向其中添加如下內容:

// mongorc.js

var compliment = ["attractive", "intelligent", "like Batman"];
var index = Math.floor(Math.random()*3);

print("Hello, you"re looking particularly "+compliment[index]+" today!");

然后,當啟動shell時,就會看到這樣一些內容:

$ mongo
MongoDB shell version: 2.4.0-
preconnecting to: test
Hello, you"re looking particularly like Batman today!
>

為了實用,可以使用這個腳本創建一些自己需要的全局變量,或者是為太長的名字創建一個簡短的別名,也可以重寫內置的函數。.mongorc.js最見的用途之一是移除那些比較“危險”的shell輔助函數。可以在這里集中重寫這些方法,比如為dropDatabase或者deleteIndexes等輔助函數添加no選項,或者取消它們的定義。

var no = function() {
    print("Not on my watch.");
};

// 禁止刪除數據庫
db.dropDatabase = DB.prototype.dropDatabase = no;

// 禁止刪除集合
DBCollection.prototype.drop = no;

// 禁止刪除索引
DBCollection.prototype.dropIndex = no;

改變數據庫函數時,要確保同時對db變量和DB原型進行改變(如上例所示)。如果只改變了其中一個,那么db變量可能沒有改變,或者這些改變在新使用的所有數據庫(運行use anotherDB命令)中都不會生效。
現在,如果試圖調用這些函數,就會得到一條錯誤提示。注意,這種方式并不能保護數據庫免受惡意用戶的攻擊,只能預防自己的手誤。
如果在啟動shell時指定--norc參數,就可以禁止加載.mongorc.js。

2.7.4 定制shell提示

將prompt變量設為一個字符串或者函數,就可以重寫默認的shell提示。例如,如果正在運行一個需要耗時幾分鐘的查詢,你可能希望完成時在shell提示中輸出當前時間,這樣就可以知道最后一個操作的完成時間了。

prompt = function() {
    return (new Date())+"> ";
};

另一個方便的提示是顯示當前使用的數據庫:

prompt = function() {
    if (typeof db == "undefined") {
        return "(nodb)> ";
    }

    // 檢查最后的數據庫操作
    try {
        db.runCommand({getLastError:1});
    }
    catch (e) {
        print(e);
    }

    return db+"> ";
};

注意,提示函數應該返回字符串,而且應該小心謹慎地處理異常:如果提示中出現了異常會對用戶造成困惑!
通常來說,提示函數中應該包含對getLastError的調用。這樣可以捕獲數據庫錯誤,而且可以在shell斷開時自動重新連接(比如重啟了mongod)。
可以在.mongorc.js中定制自己想要的提示。也可以定制多個提示,在shell中可以自由切換。

2.7.5 編輯復合變量

shell的多行支持是非常有限的:不可以編輯之前的行。如果編輯到第15行時發現第1行有個錯誤,那會讓人非常懊惱。因此,對于大塊的代碼或者是對象,你可能更愿意在編輯器中編輯。為了方便地調用編輯器,可以在shell中設置EDITOR變量(也可以在環境變量中設置):

> EDITOR="/usr/bin/emacs"

現在,如果想要編輯一個變量,可以使用"edit 變量名"這個命令,比如:

> var wap = db.books.findOne({title: "War and Peace"})
> edit wap

修改完成之后,保存并退出編輯器。變量就會被重新解析然后加載回shell。
在.mongorc.js文件中添加一行內容,EDITOR="編輯器路徑";,以后就不必多帶帶設置EDITOR變量了。

2.7.6 集合命名注意事項

可以使用db.collectionName獲取一個集合的內容,但是,如果集合名稱中包含保留字或者無效的JavaScript屬性名稱,db.collectionName就不能正常工作了。
假設要訪問version集合,不能直接使用db.version,因為db.version是db的一個方法(會返回當前MongoDB服務器的版本):

> db.version
function () {
    return this.serverBuildInfo().version;
}

為了訪問version集合,必須使用getCollection函數:

> db.getCollection("version");
test.version

如果集合名稱中包含無效的JavaScript屬性名稱(比如foo-bar-baz和123abc),也可以使用這個函數來訪問相應的集合。(注意,JavaScript屬性名稱只能包含字母、數字,以及"$"和"_"字符,而且不能以數字開頭。)
還有一種方法可以訪問以無效屬性名稱命名的集合,那就是使用數組訪問語法:在JavaScript中,x.y等同于x["y"]。也就是說,除了名稱的字面量之外,還可以使用變量訪問子集合。因此,如果需要對blog的每一個子集合進行操作,可以使用如下方式進行迭代:

var collections = ["posts", "comments", "authors"];
for (var i in collections) {
    print(db.blog[collections[i]]);
}

而不必這樣:

print(db.blog.posts);
print(db.blog.comments);
print(db.blog.authors);

注意,不能使用db.blog.i,這樣會被解釋為test.blog.i,而不是test.blog.posts。必須使用db.blog[i]語法才能將i解釋為相應的變量。
可以使用這種方式來訪問那些名字怪異的集合:

> var name = "@#&!"
> db[name].find()

直接使用db.@#&!進行查詢是非法的,但是可以使用db[name]。

上一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型
下一篇文章:MongoDB指南---5、創建、刪除文檔

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19564.html

相關文章

  • MongoDB指南---4MongoDB基礎知識-使用MongoDB Shell

    摘要:也可以在中使用函數來執行命令行程序。注意,這種方式并不能保護數據庫免受惡意用戶的攻擊,只能預防自己的手誤。必須使用語法才能將解釋為相應的變量。上一篇文章指南基礎知識數據類型下一篇文章指南創建刪除文檔 上一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型下一篇文章:MongoDB指南---5、創建、刪除文檔 本節將介紹如何將shell作為命令行工具的一部分來使用,如...

    mykurisu 評論0 收藏0
  • MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端

    摘要:上一篇文章指南簡介下一篇文章指南基礎知識數據類型非常強大但很容易上手。把同種類型的文檔放在一個集合里,數據會更加集中。命名集合使用名稱進行標識。集合名不能是空字符串。簡單起見,數據庫名應全部小寫。 上一篇文章:MongoDB指南---1、MongoDB簡介下一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型 MongoDB非常強大但很容易上手。本章會介紹一些Mon...

    SnaiLiu 評論0 收藏0
  • MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端

    摘要:上一篇文章指南簡介下一篇文章指南基礎知識數據類型非常強大但很容易上手。把同種類型的文檔放在一個集合里,數據會更加集中。命名集合使用名稱進行標識。集合名不能是空字符串。簡單起見,數據庫名應全部小寫。 上一篇文章:MongoDB指南---1、MongoDB簡介下一篇文章:MongoDB指南---3、MongoDB基礎知識-數據類型 MongoDB非常強大但很容易上手。本章會介紹一些Mon...

    W4n9Hu1 評論0 收藏0
  • MongoDB指南---3、MongoDB基礎知識-數據類型

    摘要:如將構造函數作為函數進行調用即不包括的方式,返回的是日期的字符串表示,而非日期對象。如果不注意這一點,沒有始終使用日期構造函數,將得到一堆混亂的日期對象和日期的字符串。關于日期類的完整解釋,以及構造函數的參數格式,參見規范節。 上一篇文章:MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端下一篇文章:MongoDB指南---4、MongoDB基礎知識-使用M...

    aervon 評論0 收藏0
  • MongoDB指南---3、MongoDB基礎知識-數據類型

    摘要:如將構造函數作為函數進行調用即不包括的方式,返回的是日期的字符串表示,而非日期對象。如果不注意這一點,沒有始終使用日期構造函數,將得到一堆混亂的日期對象和日期的字符串。關于日期類的完整解釋,以及構造函數的參數格式,參見規范節。 上一篇文章:MongoDB指南---2、MongoDB基礎知識-文檔、集合、數據庫、客戶端下一篇文章:MongoDB指南---4、MongoDB基礎知識-使用M...

    tunny 評論0 收藏0

發表評論

0條評論

wujl596

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<