成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

MongoDB指南---4、MongoDB基礎(chǔ)知識(shí)-使用MongoDB Shell

wujl596 / 1250人閱讀

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

上一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型
下一篇文章:MongoDB指南---5、創(chuàng)建、刪除文檔

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

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

db現(xiàn)在就指向了some-host:30000上的myDB數(shù)據(jù)庫(kù)。
啟動(dòng)mongo shell時(shí)不連接到任何mongod有時(shí)很方便。通過(guò)--nodb參數(shù)啟動(dòng)shell,啟動(dòng)時(shí)就不會(huì)連接任何數(shù)據(jù)庫(kù):

$ mongo --nodb
MongoDB shell version: 2.4.0
>

啟動(dòng)之后,在需要時(shí)運(yùn)行new Mongo(hostname)命令就可以連接到想要的mongod了:

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

執(zhí)行完這些命令之后,就可以像平常一樣使用db了。任何時(shí)候都可以使用這些命令來(lái)連接到不同的數(shù)據(jù)庫(kù)或者服務(wù)器。

2.7.1 shell小貼士

由于mongo是一個(gè)簡(jiǎn)化的JavaScript shell,可以通過(guò)查看JavaScript的在線文檔得到大量幫助。對(duì)于MongoDB特有的功能,shell內(nèi)置了幫助文檔,可以使用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
    ...

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

> 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執(zhí)行腳本

本書(shū)其他章都是以交互方式使用shell,但是也可以將希望執(zhí)行的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會(huì)依次執(zhí)行傳入的腳本,然后退出。
如果希望使用指定的主機(jī)/端口上的mongod運(yùn)行腳本,需要先指定地址,然后再跟上腳本文件的名稱:

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

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

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

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

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

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

// defineConnectTo.js 

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

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

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

如果在shell中加載這個(gè)腳本,connectTo函數(shù)就可以使用了。

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

除了添加輔助函數(shù),還可以使用腳本將通用的任務(wù)和管理活動(dòng)自動(dòng)化。
默認(rèn)情況下,shell會(huì)在運(yùn)行shell時(shí)所處的目錄中查找腳本(可以使用run("pwd")命令查看)。如果腳本不在當(dāng)前目錄中,可以為shell指定一個(gè)相對(duì)路徑或者絕對(duì)路徑。例如,如果腳本放置在~/my-scripts目錄中,可以使用load("/home/myUser/my-scripts/defineConnectTo.js")命令來(lái)加載defineConnectTo.js。注意,load函數(shù)無(wú)法解析~符號(hào)。
也可以在shell中使用run()函數(shù)來(lái)執(zhí)行命令行程序??梢栽诤瘮?shù)參數(shù)列表中指定程序所需的參數(shù):

> 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

通常來(lái)說(shuō),這種使用方式的局限性非常大,因?yàn)檩敵龈袷胶芷婀?,而且不支持管道?/p> 2.7.3 創(chuàng)建.mongorc.js文件

如果某些腳本會(huì)被頻繁加載,可以將它們添加到mongorc.js文件中。這個(gè)文件會(huì)在啟動(dòng)shell時(shí)自動(dòng)運(yùn)行。
例如,我們希望啟動(dòng)成功時(shí)讓shell顯示一句歡迎語(yǔ)。為此,我們?cè)谟脩糁髂夸浵聞?chuàng)建一個(gè)名為.mongorc.js的文件,向其中添加如下內(nèi)容:

// mongorc.js

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

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

然后,當(dāng)啟動(dòng)shell時(shí),就會(huì)看到這樣一些內(nèi)容:

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

為了實(shí)用,可以使用這個(gè)腳本創(chuàng)建一些自己需要的全局變量,或者是為太長(zhǎng)的名字創(chuàng)建一個(gè)簡(jiǎn)短的別名,也可以重寫(xiě)內(nèi)置的函數(shù)。.mongorc.js最見(jiàn)的用途之一是移除那些比較“危險(xiǎn)”的shell輔助函數(shù)??梢栽谶@里集中重寫(xiě)這些方法,比如為dropDatabase或者deleteIndexes等輔助函數(shù)添加no選項(xiàng),或者取消它們的定義。

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

// 禁止刪除數(shù)據(jù)庫(kù)
db.dropDatabase = DB.prototype.dropDatabase = no;

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

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

改變數(shù)據(jù)庫(kù)函數(shù)時(shí),要確保同時(shí)對(duì)db變量和DB原型進(jìn)行改變(如上例所示)。如果只改變了其中一個(gè),那么db變量可能沒(méi)有改變,或者這些改變?cè)谛率褂玫乃袛?shù)據(jù)庫(kù)(運(yùn)行use anotherDB命令)中都不會(huì)生效。
現(xiàn)在,如果試圖調(diào)用這些函數(shù),就會(huì)得到一條錯(cuò)誤提示。注意,這種方式并不能保護(hù)數(shù)據(jù)庫(kù)免受惡意用戶的攻擊,只能預(yù)防自己的手誤。
如果在啟動(dòng)shell時(shí)指定--norc參數(shù),就可以禁止加載.mongorc.js。

2.7.4 定制shell提示

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

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

另一個(gè)方便的提示是顯示當(dāng)前使用的數(shù)據(jù)庫(kù):

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

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

    return db+"> ";
};

注意,提示函數(shù)應(yīng)該返回字符串,而且應(yīng)該小心謹(jǐn)慎地處理異常:如果提示中出現(xiàn)了異常會(huì)對(duì)用戶造成困惑!
通常來(lái)說(shuō),提示函數(shù)中應(yīng)該包含對(duì)getLastError的調(diào)用。這樣可以捕獲數(shù)據(jù)庫(kù)錯(cuò)誤,而且可以在shell斷開(kāi)時(shí)自動(dòng)重新連接(比如重啟了mongod)。
可以在.mongorc.js中定制自己想要的提示。也可以定制多個(gè)提示,在shell中可以自由切換。

2.7.5 編輯復(fù)合變量

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

> EDITOR="/usr/bin/emacs"

現(xiàn)在,如果想要編輯一個(gè)變量,可以使用"edit 變量名"這個(gè)命令,比如:

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

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

2.7.6 集合命名注意事項(xiàng)

可以使用db.collectionName獲取一個(gè)集合的內(nèi)容,但是,如果集合名稱中包含保留字或者無(wú)效的JavaScript屬性名稱,db.collectionName就不能正常工作了。
假設(shè)要訪問(wèn)version集合,不能直接使用db.version,因?yàn)閐b.version是db的一個(gè)方法(會(huì)返回當(dāng)前MongoDB服務(wù)器的版本):

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

為了訪問(wèn)version集合,必須使用getCollection函數(shù):

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

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

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,這樣會(huì)被解釋為test.blog.i,而不是test.blog.posts。必須使用db.blog[i]語(yǔ)法才能將i解釋為相應(yīng)的變量。
可以使用這種方式來(lái)訪問(wèn)那些名字怪異的集合:

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

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

上一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型
下一篇文章:MongoDB指南---5、創(chuàng)建、刪除文檔

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/19564.html

相關(guān)文章

  • MongoDB指南---4、MongoDB基礎(chǔ)知識(shí)-使用MongoDB Shell

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

    mykurisu 評(píng)論0 收藏0
  • MongoDB指南---2、MongoDB基礎(chǔ)知識(shí)-文檔、集合、數(shù)據(jù)庫(kù)、客戶端

    摘要:上一篇文章指南簡(jiǎn)介下一篇文章指南基礎(chǔ)知識(shí)數(shù)據(jù)類型非常強(qiáng)大但很容易上手。把同種類型的文檔放在一個(gè)集合里,數(shù)據(jù)會(huì)更加集中。命名集合使用名稱進(jìn)行標(biāo)識(shí)。集合名不能是空字符串。簡(jiǎn)單起見(jiàn),數(shù)據(jù)庫(kù)名應(yīng)全部小寫(xiě)。 上一篇文章:MongoDB指南---1、MongoDB簡(jiǎn)介下一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型 MongoDB非常強(qiáng)大但很容易上手。本章會(huì)介紹一些Mon...

    SnaiLiu 評(píng)論0 收藏0
  • MongoDB指南---2、MongoDB基礎(chǔ)知識(shí)-文檔、集合、數(shù)據(jù)庫(kù)、客戶端

    摘要:上一篇文章指南簡(jiǎn)介下一篇文章指南基礎(chǔ)知識(shí)數(shù)據(jù)類型非常強(qiáng)大但很容易上手。把同種類型的文檔放在一個(gè)集合里,數(shù)據(jù)會(huì)更加集中。命名集合使用名稱進(jìn)行標(biāo)識(shí)。集合名不能是空字符串。簡(jiǎn)單起見(jiàn),數(shù)據(jù)庫(kù)名應(yīng)全部小寫(xiě)。 上一篇文章:MongoDB指南---1、MongoDB簡(jiǎn)介下一篇文章:MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型 MongoDB非常強(qiáng)大但很容易上手。本章會(huì)介紹一些Mon...

    W4n9Hu1 評(píng)論0 收藏0
  • MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型

    摘要:如將構(gòu)造函數(shù)作為函數(shù)進(jìn)行調(diào)用即不包括的方式,返回的是日期的字符串表示,而非日期對(duì)象。如果不注意這一點(diǎn),沒(méi)有始終使用日期構(gòu)造函數(shù),將得到一堆混亂的日期對(duì)象和日期的字符串。關(guān)于日期類的完整解釋,以及構(gòu)造函數(shù)的參數(shù)格式,參見(jiàn)規(guī)范節(jié)。 上一篇文章:MongoDB指南---2、MongoDB基礎(chǔ)知識(shí)-文檔、集合、數(shù)據(jù)庫(kù)、客戶端下一篇文章:MongoDB指南---4、MongoDB基礎(chǔ)知識(shí)-使用M...

    aervon 評(píng)論0 收藏0
  • MongoDB指南---3、MongoDB基礎(chǔ)知識(shí)-數(shù)據(jù)類型

    摘要:如將構(gòu)造函數(shù)作為函數(shù)進(jìn)行調(diào)用即不包括的方式,返回的是日期的字符串表示,而非日期對(duì)象。如果不注意這一點(diǎn),沒(méi)有始終使用日期構(gòu)造函數(shù),將得到一堆混亂的日期對(duì)象和日期的字符串。關(guān)于日期類的完整解釋,以及構(gòu)造函數(shù)的參數(shù)格式,參見(jiàn)規(guī)范節(jié)。 上一篇文章:MongoDB指南---2、MongoDB基礎(chǔ)知識(shí)-文檔、集合、數(shù)據(jù)庫(kù)、客戶端下一篇文章:MongoDB指南---4、MongoDB基礎(chǔ)知識(shí)-使用M...

    tunny 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wujl596

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<