MongoDB——Shell的基本操作及使用窍门
MongoDB自帶一個(gè)JavaScript shell,可以從命令行與MongoDB實(shí)例交互。這個(gè) shell非常有用,通過(guò)它可以執(zhí)行管理操作、檢査運(yùn)行實(shí)例,亦或做其他嘗試。這個(gè) mongo shell對(duì)于使用MongoDB來(lái)說(shuō)是至關(guān)重要的工具,本書(shū)后面也會(huì)經(jīng)常使用這 個(gè)工具。
- 運(yùn)行shell
運(yùn)行mongo啟動(dòng)shell:
$ ./mongo MongoDB shell version: 1.6.0 url: test connecting to: test type "help" for helpshell會(huì)在啟動(dòng)時(shí)自動(dòng)連接MongoDB服務(wù)器,所以要確保在使用shell之前啟動(dòng)mongodo shell是功能完備的JavaScript解釋器,可以運(yùn)行任何JavaScript程序。為了證明這 一點(diǎn),我們運(yùn)行幾個(gè)簡(jiǎn)單的數(shù)學(xué)運(yùn)算:
>x = 200 200 >x / 5; 40還可以充分利用JavaScript的標(biāo)準(zhǔn)庫(kù)。
>Math.sin(Math.PI / 2); 1 >new Date(''2010/l/l"); "Fri Jan 01 2010 00:00:00 GMT-0500 (EST)? >"Hello, World! " . replace ("World, "MongoDB"); Hello, MongoDB!也可以定義和調(diào)用JavaScript函數(shù):
>function factorial (n) { ...if (n <= 1) return 1; ... return n * factorial(n - 1); ---} >factorial(5); 120注意,可以使用多行命令。這個(gè)shell會(huì)檢測(cè)輸入的JavaScript語(yǔ)句是否寫(xiě)完,如沒(méi) 寫(xiě)完還可以在下一行接著寫(xiě)。
- MongoDB 客戶(hù)端
雖然能運(yùn)行任意JavaScript程序很酷,但shell的真正威力還在于它是一個(gè)獨(dú)立的Mongo- DB客戶(hù)端。開(kāi)啟的時(shí)候,shell會(huì)連到MongoDB服務(wù)器的test數(shù)據(jù)庫(kù),并將這個(gè)數(shù)據(jù) 庫(kù)連接賦值給全局變量dbo這個(gè)變量是通過(guò)sheU訪(fǎng)問(wèn)MongoDB的主要入口點(diǎn)。
shell還有些非JavaScript語(yǔ)法的擴(kuò)展,是為了方便習(xí)慣于SQL shell的用戶(hù)而添加 的。這些擴(kuò)展并不提供額外的功能,但它們是很棒的語(yǔ)法糖。例如,最重要的操作 之一就是選擇要使用的數(shù)據(jù)庫(kù):
現(xiàn)在如果看看db,會(huì)發(fā)現(xiàn)其指向foobar數(shù)據(jù)庫(kù):
>db foobar因?yàn)檫@是一個(gè)JavaScript shell,所以鍵入一個(gè)變量會(huì)將變量的值轉(zhuǎn)換為字符串(這 里就是數(shù)據(jù)庫(kù)名)并打印出來(lái)。
可以通過(guò)db變量來(lái)訪(fǎng)問(wèn)其中的集合。例如db.baz返回當(dāng)前數(shù)據(jù)庫(kù)的baz集合。既然 現(xiàn)在可以在shell中訪(fǎng)問(wèn)集合,那么基本上就可以執(zhí)行幾乎所有的數(shù)據(jù)庫(kù)操作了。
- shell中的基本操作
在shell査看操作數(shù)據(jù)會(huì)用到4個(gè)基本操作:創(chuàng)建、讀取、更新和刪除(CRUD)。
- 1.創(chuàng)建
insert函數(shù)添加一個(gè)文檔到集合里面。例如,假設(shè)要存儲(chǔ)一篇博客文章。首先, 創(chuàng)建一個(gè)局部變量post,內(nèi)容是代表文檔的JavaScript對(duì)象。里面會(huì)有"title", “content"和"date”(發(fā)表日期)幾個(gè)鍵。
>post = ( nti11 e11 : "My Blog Post11, ..."content" : "Here's my blog post.", ...ndate11 : new Date () } ( "title" : "My Blog Post", "content" : "Here * s my blog post.H, "date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)" }這個(gè)對(duì)象是個(gè)有效的MongoDB文檔,所以可以用insert方法將其保存到blog集 合中:
>db ..blog. insert (post)這篇文章已經(jīng)被存到數(shù)據(jù)庫(kù)里面了。可以調(diào)用集合的find方法來(lái)査看一下:
>db.blog.find() ( : Objectld(,,4b2 3c3ca752 5f35f94b6 0a2d"), : "My Blog Post", "content" : "Here 1s my blog post.", "date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)" }除了我們輸入的鍵/值對(duì)都完整地被保存下來(lái),還有一個(gè)額外添加的鍵?_id"o本 章的最后會(huì)解釋"_id"突然出現(xiàn)的原因。
- 2.讀取
find會(huì)返回集合里面所有的文檔。若只是想査看一個(gè)文檔,可以用findOne:
>db.blog.findOne() {"_id" : Objectld( ''4b2 3c3ca7525f3 5f94b60a2d?),"title11 : "My Blog Post","content” : "Here's my blog post.","date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)" }find和f indOne可以接受査詢(xún)文檔形式的限定條件。這將通過(guò)査詢(xún)限制匹配的文 檔。使用find時(shí),shell自動(dòng)顯示最多20個(gè)匹配的文檔,但可以獲取更多文檔。
- 3.更新
如果要更改博客文章,就要用到update To update接受(至少)兩個(gè)參數(shù):第一 個(gè)是要更新文檔的限定條件,第二個(gè)是新的文檔。假設(shè)決定給我們先前寫(xiě)的文章增 加評(píng)論內(nèi)容,則需要增加一個(gè)新的鍵,對(duì)應(yīng)的值是存放評(píng)論的數(shù)組。
第一步修改變量post,增加"comments"鍵:
然后執(zhí)行update操作,用新版本的文檔替換標(biāo)題為aMy Blog Post"的文章:
>db.blog.update((title : "My Blog Post"}, post)文檔已經(jīng)有了”comments”鍵。再用find査看一下,可以看到新的鍵:
>db.blog.find() {"_id": ObjectId(M4b23c3ca7525f35f94b60a2dn),"title" : "My Blog Post"t"content" : MHere's my blog post.","date" : "Sat Dec 12 2009 11:23:21 GMT-0500 (EST)","comments":[] }- 4.刪除
remove用來(lái)從數(shù)據(jù)庫(kù)中永久性地刪除文檔。在不使用參數(shù)進(jìn)行調(diào)用的情況下,它 會(huì)刪除一個(gè)集合內(nèi)的所有文檔。它也可以接受一個(gè)文檔以指定限定條件。例如,下 面的命令會(huì)刪除我們剛剛創(chuàng)建的文章:
>db.blog.remove((title : "My Blog Post"})集合現(xiàn)在又是空的了。
- 使用shell的竅門(mén)
由于mongo是個(gè)JavaScript shell,通過(guò)在線(xiàn)査看JavaScript的文檔能獲得很多幫助。 shell本身內(nèi)置了幫助文檔,可以通過(guò)help命令査看。
>help HELP show dbs show database names show collections in current database show users in current database show recent system.profile entries w. time >= Iras set current database to <db name> help on DB methods help on collection methods . list objects in collection foo list objects in foo where a == 1 result of the last line evaluated使用db.help ()可以査看數(shù)據(jù)庫(kù)級(jí)別的命令的幫助,集合的相關(guān)幫助可以通過(guò)db. foo. help ()來(lái)査看。
有個(gè)了解函數(shù)功用的技巧,就是在輸入的時(shí)候不要輸括號(hào)。這樣就會(huì)顯示該函數(shù)的 JavaScript源代碼。例如,如果想看看update的機(jī)理,或者就是為了看看參數(shù)順 序,可以這么做:
要査看shell提供的所有自動(dòng)生成的JavaScript函數(shù)API文檔,可訪(fǎng)問(wèn)http://api.mon- godb.org/jso
蹩腳的集合名
使用db.集合名的方式來(lái)訪(fǎng)問(wèn)集合一般不會(huì)有問(wèn)題,但如果集合名恰好是數(shù)據(jù)庫(kù)類(lèi) 的一個(gè)屬性就有問(wèn)題了。例如,要訪(fǎng)問(wèn)version這個(gè)集合,使用db. vers ion就 不行,因?yàn)閐b.version是個(gè)數(shù)據(jù)庫(kù)函數(shù)(它返回正在運(yùn)行的MongoDB服務(wù)器的 版本)。
當(dāng)JavaScript只有在db中找不到指定的屬性時(shí),才會(huì)將其作為集合返回。當(dāng)有屬性 與目標(biāo)集合同名時(shí),可以使用getCollection函數(shù):
>db.getCollection("version"); test.version要査看名稱(chēng)中含有無(wú)效JavaScript字符的集合,這個(gè)函數(shù)也可以派上用場(chǎng)。比如£。。-
bar是個(gè)有效的集合名,但是在JavaScript中就變成了變量相減了。通過(guò)db.get- Collection ( " f oo-bax")可以得到 f oo-bax 集合。
在JavaScript中,x.y與x[‘y’]完全等價(jià)。這就意味著不但可以直“呼”其名,也可 以使用變量來(lái)訪(fǎng)問(wèn)子集合。也就是說(shuō),當(dāng)需要對(duì)blog的每個(gè)子集合執(zhí)行操作時(shí),只需 要像下面這樣迭代就好了:
而不是使用下面這種笨笨的寫(xiě)法:
doStuff(db.blog.posts); doStuff(db.blog.comments); doStuff(db.blog.authors);總結(jié)
以上是生活随笔為你收集整理的MongoDB——Shell的基本操作及使用窍门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hadoop大数据——mapreduce
- 下一篇: 趣味图解编程算法,文科生都看懂了