mongodb连接失败_MongoDB 基础入门
mongodb
一、NoSQL 簡(jiǎn)介
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
在現(xiàn)代的計(jì)算系統(tǒng)上每天網(wǎng)絡(luò)上都會(huì)產(chǎn)生龐大的數(shù)據(jù)量。
這些數(shù)據(jù)有很大一部分是由關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDMBSs)來處理。 1970年 E.F.Codd's提出的關(guān)系模型的論文 "A relational model of data for large shared data banks",這使得數(shù)據(jù)建模和應(yīng)用程序編程更加簡(jiǎn)單。
通過應(yīng)用實(shí)踐證明,關(guān)系模型是非常適合于客戶服務(wù)器編程,遠(yuǎn)遠(yuǎn)超出預(yù)期的利益,今天它是結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)在網(wǎng)絡(luò)和商務(wù)應(yīng)用的主導(dǎo)技術(shù)。
NoSQL 是一項(xiàng)全新的數(shù)據(jù)庫革命性運(yùn)動(dòng),早期就有人提出,發(fā)展至2009年趨勢(shì)越發(fā)高漲。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ),相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫運(yùn)用,這一概念無疑是一種全新的思維的注入。
1.1 關(guān)系型數(shù)據(jù)庫遵循ACID規(guī)則
事務(wù)在英文中是transaction,和現(xiàn)實(shí)世界中的交易很類似,它有如下四個(gè)特性:
1、A (Atomicity) 原子性 原子性很容易理解,也就是說事務(wù)里的所有操作要么全部做完,要么都不做,事務(wù)成功的條件是事務(wù)里的所有操作都成功,只要有一個(gè)操作失敗,整個(gè)事務(wù)就失敗,需要回滾。
比如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元至B賬戶,分為兩個(gè)步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要么一起完成,要么一起不完成,如果只完成第一步,第二步失敗,錢會(huì)莫名其妙少了100元。
2、C (Consistency) 一致性 一致性也比較容易理解,也就是說數(shù)據(jù)庫要一直處于一致的狀態(tài),事務(wù)的運(yùn)行不會(huì)改變數(shù)據(jù)庫原本的一致性約束。
例如現(xiàn)有完整性約束a+b=10,如果一個(gè)事務(wù)改變了a,那么必須得改變b,使得事務(wù)結(jié)束后依然滿足a+b=10,否則事務(wù)失敗。
3、I (Isolation) 獨(dú)立性 所謂的獨(dú)立性是指并發(fā)的事務(wù)之間不會(huì)互相影響,如果一個(gè)事務(wù)要訪問的數(shù)據(jù)正在被另外一個(gè)事務(wù)修改,只要另外一個(gè)事務(wù)未提交,它所訪問的數(shù)據(jù)就不受未提交事務(wù)的影響。 比如現(xiàn)有有個(gè)交易是從A賬戶轉(zhuǎn)100元至B賬戶,在這個(gè)交易還未完成的情況下,如果此時(shí)B查詢自己的賬戶,是看不到新增加的100元的。
4、D (Durability) 持久性 持久性是指一旦事務(wù)提交后,它所做的修改將會(huì)永久的保存在數(shù)據(jù)庫上,即使出現(xiàn)宕機(jī)也不會(huì)丟失。
1.2 分布式系統(tǒng)
分布式系統(tǒng)(distributed system)由多臺(tái)計(jì)算機(jī)和通信的軟件組件通過計(jì)算機(jī)網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。
分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。正是因?yàn)檐浖奶匦?#xff0c;所以分布式系統(tǒng)具有高度的內(nèi)聚性和透明性。
因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng)),而不是硬件。
分布式系統(tǒng)可以應(yīng)用在在不同的平臺(tái)上如:Pc、工作站、局域網(wǎng)和廣域網(wǎng)上等。
1.3 分布式計(jì)算的優(yōu)點(diǎn)
可靠性(容錯(cuò)) : 分布式計(jì)算系統(tǒng)中的一個(gè)重要的優(yōu)點(diǎn)是可靠性。一臺(tái)服務(wù)器的系統(tǒng)崩潰并不影響到其余的服務(wù)器。
可擴(kuò)展性: 在分布式計(jì)算系統(tǒng)可以根據(jù)需要增加更多的機(jī)器。
資源共享: 共享數(shù)據(jù)是必不可少的應(yīng)用,如銀行,預(yù)訂系統(tǒng)。
靈活性: 由于該系統(tǒng)是非常靈活的,它很容易安裝,實(shí)施和調(diào)試新的服務(wù)。
更快的速度: 分布式計(jì)算系統(tǒng)可以有多臺(tái)計(jì)算機(jī)的計(jì)算能力,使得它比其他系統(tǒng)有更快的處理速度。
開放系統(tǒng): 由于它是開放的系統(tǒng),本地或者遠(yuǎn)程都可以訪問到該服務(wù)。
更高的性能: 相較于集中式計(jì)算機(jī)網(wǎng)絡(luò)集群可以提供更高的性能(及更好的性價(jià)比)。
1.4分布式計(jì)算的缺點(diǎn)
故障排除: : 故障排除和診斷問題。
軟件: 更少的軟件支持是分布式計(jì)算系統(tǒng)的主要缺點(diǎn)。
網(wǎng)絡(luò): 網(wǎng)絡(luò)基礎(chǔ)設(shè)施的問題,包括:傳輸問題,高負(fù)載,信息丟失等。
安全性: 開發(fā)系統(tǒng)的特性讓分布式計(jì)算系統(tǒng)存在著數(shù)據(jù)的安全性和共享的風(fēng)險(xiǎn)等問題。
什么是NoSQL?
NoSQL,指的是非關(guān)系型的數(shù)據(jù)庫。NoSQL有時(shí)也稱作Not Only SQL的縮寫,是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理系統(tǒng)的統(tǒng)稱。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數(shù)據(jù))。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無需多余操作就可以橫向擴(kuò)展。
為什么使用NoSQL ?
今天我們可以通過第三方平臺(tái)(如:Google,Facebook等)可以很容易的訪問和抓取數(shù)據(jù)。用戶的個(gè)人信息,社交網(wǎng)絡(luò),地理位置,用戶生成的數(shù)據(jù)和用戶操作日志已經(jīng)成倍的增加。我們?nèi)绻獙?duì)這些用戶數(shù)據(jù)進(jìn)行挖掘,那SQL數(shù)據(jù)庫已經(jīng)不適合這些應(yīng)用了, NoSQL數(shù)據(jù)庫的發(fā)展也卻能很好的處理這些大的數(shù)據(jù)。
實(shí)例
社會(huì)化關(guān)系網(wǎng):
Each record: UserID1, UserID2 Separate records: UserID, first_name,last_name, age, gender,... Task: Find all friends of friends of friends of ... friends of a given user.
Wikipedia 頁面 :
Large collection of documents Combination of structured and unstructured data Task: Retrieve all pages regarding athletics of Summer Olympic before 1950.
RDBMS vs NoSQL
RDBMS
- 高度組織化結(jié)構(gòu)化數(shù)據(jù)
- 結(jié)構(gòu)化查詢語言(SQL) (SQL)
- 數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中。
- 數(shù)據(jù)操縱語言,數(shù)據(jù)定義語言
- 嚴(yán)格的一致性
- 基礎(chǔ)事務(wù)
NoSQL
- 代表著不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預(yù)定義的模式 -鍵 - 值對(duì)存儲(chǔ),列存儲(chǔ),文檔存儲(chǔ),圖形數(shù)據(jù)庫
- 最終一致性,而非ACID屬性
- 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
- CAP定理
- 高性能,高可用性和可伸縮性
NoSQL 簡(jiǎn)史
NoSQL一詞最早出現(xiàn)于1998年,是Carlo Strozzi開發(fā)的一個(gè)輕量、開源、不提供SQL功能的關(guān)系數(shù)據(jù)庫。
2009年,Last.fm的Johan Oskarsson發(fā)起了一次關(guān)于分布式開源數(shù)據(jù)庫的討論[2],來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時(shí)的NoSQL主要指非關(guān)系型、分布式、不提供ACID的數(shù)據(jù)庫設(shè)計(jì)模式。
2009年在亞特蘭大舉行的"no:sql(east)"討論會(huì)是一個(gè)里程碑,其口號(hào)是"select fun, profit from real_world where relational=false;"。因此,對(duì)NoSQL最普遍的解釋是"非關(guān)聯(lián)型的",強(qiáng)調(diào)Key-Value Stores和文檔數(shù)據(jù)庫的優(yōu)點(diǎn),而不是單純的反對(duì)RDBMS。
CAP定理(CAP theorem)
在計(jì)算機(jī)科學(xué)中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對(duì)于一個(gè)分布式計(jì)算系統(tǒng)來說,不可能同時(shí)滿足以下三點(diǎn):
- 一致性(Consistency) (所有節(jié)點(diǎn)在同一時(shí)間具有相同的數(shù)據(jù))
- 可用性(Availability) (保證每個(gè)請(qǐng)求不管成功或者失敗都有響應(yīng))
- 分隔容忍(Partition tolerance) (系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作)
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
因此,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
- CA - 單點(diǎn)集群,滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大。
- CP - 滿足一致性,分區(qū)容忍必的系統(tǒng),通常性能不是特別高。
- AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通常可能對(duì)一致性要求低一些。
NoSQL的優(yōu)點(diǎn)/缺點(diǎn)
優(yōu)點(diǎn):
- - 高可擴(kuò)展性
- - 分布式計(jì)算
- - 低成本
- - 架構(gòu)的靈活性,半結(jié)構(gòu)化數(shù)據(jù)
- - 沒有復(fù)雜的關(guān)系
缺點(diǎn):
- - 沒有標(biāo)準(zhǔn)化
- - 有限的查詢功能(到目前為止)
- - 最終一致是不直觀的程序
BASE
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
BASE是NoSQL數(shù)據(jù)庫通常對(duì)可用性及一致性的弱要求原則:
- Basically Availble --基本可用
- Soft-state --軟狀態(tài)/柔性事務(wù)。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
- Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的。
ACID vs BASE
ACIDBASE原子性(Atomicity)基本可用(Basically Available)一致性(Consistency)軟狀態(tài)/柔性事務(wù)(Soft state)隔離性(Isolation)最終一致性 (Eventual consistency)持久性 (Durable)
NoSQL 數(shù)據(jù)庫分類
類型部分代表特點(diǎn)列存儲(chǔ)HbaseCassandraHypertable顧名思義,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)。文檔存儲(chǔ)MongoDBCouchDB文檔存儲(chǔ)一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫的某些功能。key-value存儲(chǔ)Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis可以通過key快速查詢到其value。一般來說,存儲(chǔ)不管value的格式,照單全收。(Redis包含了其他功能)圖存儲(chǔ)Neo4JFlockDB圖形關(guān)系的最佳存儲(chǔ)。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫來解決的話性能低下,而且設(shè)計(jì)使用不方便。對(duì)象存儲(chǔ)db4oVersant通過類似面向?qū)ο笳Z言的語法操作數(shù)據(jù)庫,通過對(duì)象的方式存取數(shù)據(jù)。xml數(shù)據(jù)庫Berkeley DB XMLBaseX高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語法,比如XQuery,Xpath。
二、MongoDB 概念解析
不管我們學(xué)習(xí)什么數(shù)據(jù)庫都應(yīng)該學(xué)習(xí)其中的基礎(chǔ)概念,在mongodb中基本的概念是文檔、集合、數(shù)據(jù)庫,下面我們挨個(gè)介紹。
下表將幫助您更容易理解Mongo中的一些概念:
SQL術(shù)語/概念MongoDB術(shù)語/概念解釋/說明databasedatabase數(shù)據(jù)庫tablecollection數(shù)據(jù)庫表/集合rowdocument數(shù)據(jù)記錄行/文檔columnfield數(shù)據(jù)字段/域indexindex索引table joins表連接,MongoDB不支持primary keyprimary key主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵
通過下圖實(shí)例,我們也可以更直觀的的了解Mongo中的一些概念:
2.1 數(shù)據(jù)庫
一個(gè)mongodb中可以建立多個(gè)數(shù)據(jù)庫。
MongoDB的默認(rèn)數(shù)據(jù)庫為"db",該數(shù)據(jù)庫存儲(chǔ)在data目錄中。
MongoDB的單個(gè)實(shí)例可以容納多個(gè)獨(dú)立的數(shù)據(jù)庫,每一個(gè)都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫也放置在不同的文件中。
"show dbs" 命令可以顯示所有數(shù)據(jù)的列表。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > show dbs local 0.078GB test 0.078GB >執(zhí)行 "db" 命令可以顯示當(dāng)前數(shù)據(jù)庫對(duì)象或集合。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > db test >運(yùn)行"use"命令,可以連接到一個(gè)指定的數(shù)據(jù)庫。
> use local switched to db local > db local >以上實(shí)例命令中,"local" 是你要鏈接的數(shù)據(jù)庫。
在下一個(gè)章節(jié)我們將詳細(xì)講解MongoDB中命令的使用。
數(shù)據(jù)庫也通過名字來標(biāo)識(shí)。數(shù)據(jù)庫名可以是滿足以下條件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、和0 (空宇符)。
- 應(yīng)全部小寫。
- 最多64字節(jié)。
有一些數(shù)據(jù)庫名是保留的,可以直接訪問這些有特殊作用的數(shù)據(jù)庫。
- admin: 從權(quán)限的角度來看,這是"root"數(shù)據(jù)庫。要是將一個(gè)用戶添加到這個(gè)數(shù)據(jù)庫,這個(gè)用戶自動(dòng)繼承所有數(shù)據(jù)庫的權(quán)限。一些特定的服務(wù)器端命令也只能從這個(gè)數(shù)據(jù)庫運(yùn)行,比如列出所有的數(shù)據(jù)庫或者關(guān)閉服務(wù)器。
- local: 這個(gè)數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制,可以用來存儲(chǔ)限于本地單臺(tái)服務(wù)器的任意集合
- config: 當(dāng)Mongo用于分片設(shè)置時(shí),config數(shù)據(jù)庫在內(nèi)部使用,用于保存分片的相關(guān)信息。
2.2 文檔
文檔是一個(gè)鍵值(key-value)對(duì)(即BSON)。MongoDB 的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,也是 MongoDB 非常突出的特點(diǎn)。
一個(gè)簡(jiǎn)單的文檔例子如下:
{"site":"www.runoob.com", "name":"菜鳥教程"}下表列出了 RDBMS 與 MongoDB 對(duì)應(yīng)的術(shù)語:
需要注意的是:
文檔鍵命名規(guī)范:
- 鍵不能含有0 (空字符)。這個(gè)字符用來表示鍵的結(jié)尾。
- .和$有特別的意義,只有在特定環(huán)境下才能使用。
- 以下劃線"_"開頭的鍵是保留的(不是嚴(yán)格要求的)。
2.3 集合
集合就是 MongoDB 文檔組,類似于 RDBMS (關(guān)系數(shù)據(jù)庫管理系統(tǒng):Relational Database Management System)中的表格。
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu),這意味著你在對(duì)集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性。
比如,我們可以將以下不同數(shù)據(jù)結(jié)構(gòu)的文檔插入到集合中:
{"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鳥教程","num":5}當(dāng)?shù)谝粋€(gè)文檔插入時(shí),集合就會(huì)被創(chuàng)建。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有0字符(空字符),這個(gè)字符表示集合名的結(jié)尾。
- 集合名不能以"system."開頭,這是為系統(tǒng)集合保留的前綴。
- 用戶創(chuàng)建的集合名字不能含有保留字符。有些驅(qū)動(dòng)程序的確支持在集合名里面包含,這是因?yàn)槟承┫到y(tǒng)生成的集合中包含該字符。除非你要訪問這種系統(tǒng)創(chuàng)建的集合,否則千萬不要在名字里出現(xiàn)$。
如下實(shí)例:
db.col.findOne()capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及隊(duì)列過期的特性(過期按照插入的順序). 有點(diǎn)和 "RRD" 概念類似。
Capped collections是高性能自動(dòng)的維護(hù)對(duì)象的插入順序。它非常適合類似記錄日志的功能 和標(biāo)準(zhǔn)的collection不同,你必須要顯式的創(chuàng)建一個(gè)capped collection, 指定一個(gè)collection的大小,單位是字節(jié)。collection的數(shù)據(jù)存儲(chǔ)空間值提前分配的。
要注意的是指定的存儲(chǔ)大小包含了數(shù)據(jù)庫的頭信息。
db.createCollection("mycoll", {capped:true, size:100000})- 在capped collection中,你能添加新的對(duì)象。
- 能進(jìn)行更新,然而,對(duì)象不會(huì)增加存儲(chǔ)空間。如果增加,更新就會(huì)失敗 。
- 數(shù)據(jù)庫不允許進(jìn)行刪除。使用drop()方法刪除collection所有的行。
- 注意: 刪除之后,你必須顯式的重新創(chuàng)建這個(gè)collection。
- 在32bit機(jī)器中,capped collection最大存儲(chǔ)為1e9( 1X109)個(gè)字節(jié)。
2.4 元數(shù)據(jù)
數(shù)據(jù)庫的信息是存儲(chǔ)在集合中。它們使用了系統(tǒng)的命名空間:
dbname.system.*在MongoDB數(shù)據(jù)庫中名字空間 <dbname>.system.* 是包含多種系統(tǒng)信息的特殊集合(Collection),如下:
對(duì)于修改系統(tǒng)集合中的對(duì)象有如下限制。
在{{system.indexes}}插入數(shù)據(jù),可以創(chuàng)建索引。但除此之外該表信息是不可變的(特殊的drop index命令將自動(dòng)更新相關(guān)信息)。
{{system.users}}是可修改的。 {{system.profile}}是可刪除的。
2.5 MongoDB 數(shù)據(jù)類型
下表為MongoDB中常用的幾種數(shù)據(jù)類型。
三、什么是MongoDB ?
MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。
MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
主要特點(diǎn)
- MongoDB的提供了一個(gè)面向文檔存儲(chǔ),操作起來比較簡(jiǎn)單和容易。
- 你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實(shí)現(xiàn)更快的排序。
- 你可以通過本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
- 如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
- Mongo支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組。
- MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
- Mongodb中的Map/reduce主要是用來對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。
- Map和Reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進(jìn)行處理。
- Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
- GridFS是MongoDB中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。
- MongoDB允許在服務(wù)端執(zhí)行腳本,可以用Javascript編寫某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。
- MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡(jiǎn)單。
歷史 2007年10月,MongoDB由10gen團(tuán)隊(duì)所發(fā)展。2009年2月首度推出。
- 2012年05月23日,MongoDB2.1 開發(fā)分支發(fā)布了! 該版本采用全新架構(gòu),包含諸多增強(qiáng)。
- 2012年06月06日,MongoDB 2.0.6 發(fā)布,分布式文檔數(shù)據(jù)庫。
- 2013年04月23日,MongoDB 2.4.3 發(fā)布,此版本包括了一些性能優(yōu)化,功能增強(qiáng)以及bug修復(fù)。
- 2013年08月20日,MongoDB 2.4.6 發(fā)布,是目前最新的穩(wěn)定版。
MongoDB 下載
你可以在mongodb官網(wǎng)下載該安裝包,地址為: http://www.mongodb.org/downloads。MonggoDB支持以下平臺(tái):
- OS X 32-bit
- OS X 64-bit
- Linux 32-bit
- Linux 64-bit
- Windows 32-bit
- Windows 64-bit
- Solaris i86pc
- Solaris 64
MongoDB 工具
有幾種可用于MongoDB的管理工具。
監(jiān)控
MongoDB提供了網(wǎng)絡(luò)和系統(tǒng)監(jiān)控工具M(jìn)unin,它作為一個(gè)插件應(yīng)用于MongoDB中。
Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個(gè)插件應(yīng)用于MongoDB中。
基于圖形界面的開源工具 Cacti, 用于查看CPU負(fù)載, 網(wǎng)絡(luò)帶寬利用率,它也提供了一個(gè)應(yīng)用于監(jiān)控 MongoDB 的插件。
GUI
- Fang of Mongo – 網(wǎng)頁式,由Django和jQuery所構(gòu)成。
- Futon4Mongo – 一個(gè)CouchDB Futon web的mongodb山寨版。
- Mongo3 – Ruby寫成。
- MongoHub – 適用于OSX的應(yīng)用程序。
- Opricot – 一個(gè)基于瀏覽器的MongoDB控制臺(tái), 由PHP撰寫而成。
- Database Master — Windows的mongodb管理工具
- RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級(jí), 支持多國(guó)語言.
MongoDB 應(yīng)用案例
下面列舉一些公司MongoDB的實(shí)際應(yīng)用:
- Craiglist上使用MongoDB的存檔數(shù)十億條記錄。
- FourSquare,基于位置的社交網(wǎng)站,在Amazon EC2的服務(wù)器上使用MongoDB分享數(shù)據(jù)。
- Shutterfly,以互聯(lián)網(wǎng)為基礎(chǔ)的社會(huì)和個(gè)人出版服務(wù),使用MongoDB的各種持久性數(shù)據(jù)存儲(chǔ)的要求。
- bit.ly, 一個(gè)基于Web的網(wǎng)址縮短服務(wù),使用MongoDB的存儲(chǔ)自己的數(shù)據(jù)。
- http://spike.com,一個(gè)MTV網(wǎng)絡(luò)的聯(lián)營(yíng)公司, http://spike.com使用MongoDB的。
- Intuit公司,一個(gè)為小企業(yè)和個(gè)人的軟件和服務(wù)提供商,為小型企業(yè)使用MongoDB的跟蹤用戶的數(shù)據(jù)。
- http://sourceforge.net,資源網(wǎng)站查找,創(chuàng)建和發(fā)布開源軟件免費(fèi),使用MongoDB的后端存儲(chǔ)。
- http://etsy.com ,一個(gè)購買和出售手工制作物品網(wǎng)站,使用MongoDB。
- 紐約時(shí)報(bào),領(lǐng)先的在線新聞門戶網(wǎng)站之一,使用MongoDB。
- CERN,著名的粒子物理研究所,歐洲核子研究中心大型強(qiáng)子對(duì)撞機(jī)的數(shù)據(jù)使用MongoDB。
四、MongoDB的安裝
4.1 window平臺(tái)安裝 MongoDB
MongoDB 提供了可用于 32 位和 64 位系統(tǒng)的預(yù)編譯二進(jìn)制包,你可以從MongoDB官網(wǎng)下載安裝,MongoDB 預(yù)編譯二進(jìn)制包下載地址:https://www.mongodb.com/download-center#community
注意:在 MongoDB 2.2 版本后已經(jīng)不再支持 Windows XP 系統(tǒng)。最新版本也已經(jīng)沒有了 32 位系統(tǒng)的安裝文件。- MongoDB for Windows 64-bit 適合 64 位的 Windows Server 2008 R2, Windows 7 , 及最新版本的 Window 系統(tǒng)。
- MongoDB for Windows 32-bit 適合 32 位的 Window 系統(tǒng)及最新的 Windows Vista。 32 位系統(tǒng)上 MongoDB 的數(shù)據(jù)庫最大為 2GB。
- MongoDB for Windows 64-bit Legacy 適合 64 位的 Windows Vista, Windows Server 2003, 及 Windows Server 2008 。
根據(jù)你的系統(tǒng)下載 32 位或 64 位的 .msi 文件,下載后雙擊該文件,按操作提示安裝即可。
安裝過程中,你可以通過點(diǎn)擊 "Custom(自定義)" 按鈕來設(shè)置你的安裝目錄。
下一步安裝 "install mongoDB compass" 不勾選,否則可能要很長(zhǎng)時(shí)間都一直在執(zhí)行安裝,MongoDB Compass 是一個(gè)圖形界面管理工具,我們可以在后面自己到官網(wǎng)下載安裝,下載地址:https://www.mongodb.com/download-center/compass。
創(chuàng)建數(shù)據(jù)目錄
MongoDB將數(shù)據(jù)目錄存儲(chǔ)在 db 目錄下。但是這個(gè)數(shù)據(jù)目錄不會(huì)主動(dòng)創(chuàng)建,我們?cè)诎惭b完成后需要?jiǎng)?chuàng)建它。請(qǐng)注意,數(shù)據(jù)目錄應(yīng)該放在根目錄下((如: C: 或者 D: 等 )。
在本教程中,我們已經(jīng)在 C 盤安裝了 mongodb,現(xiàn)在讓我們創(chuàng)建一個(gè) data 的目錄然后在 data 目錄里創(chuàng)建 db 目錄。
c:>cd c: ? c:>mkdir data ? c:>cd data ? c:data>mkdir db ? c:data>cd db ? c:datadb>你也可以通過 window 的資源管理器中創(chuàng)建這些目錄,而不一定通過命令行。
4.1.1 命令行下運(yùn)行 MongoDB 服務(wù)器
為了從命令提示符下運(yùn)行 MongoDB 服務(wù)器,你必須從 MongoDB 目錄的 bin 目錄中執(zhí)行 mongod.exe 文件。
C:mongodbbinmongod --dbpath c:datadb如果執(zhí)行成功,會(huì)輸出如下信息:
2015-09-25T15:54:09.212+0800 I CONTROL Hotfix KB2731284 or later update is not installed, will zero-out data files 2015-09-25T15:54:09.229+0800 I JOURNAL [initandlisten] journal dir=c:datadbj ournal 2015-09-25T15:54:09.237+0800 I JOURNAL [initandlisten] recover : no journal fil es present, no recovery needed 2015-09-25T15:54:09.290+0800 I JOURNAL [durability] Durability thread started 2015-09-25T15:54:09.294+0800 I CONTROL [initandlisten] MongoDB starting : pid=2 488 port=27017 dbpath=c:datadb 64-bit host=WIN-1VONBJOCE88 2015-09-25T15:54:09.296+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/W indows Server 2008 R2 2015-09-25T15:54:09.298+0800 I CONTROL [initandlisten] db version v3.0.6 ……4.1.2 連接MongoDB
我們可以在命令窗口中運(yùn)行 mongo.exe 命令即可連接上 MongoDB,執(zhí)行如下命令:
C:mongodbbinmongo.exe4.1.3 配置 MongoDB 服務(wù)
管理員模式打開命令行窗口
創(chuàng)建目錄,執(zhí)行下面的語句來創(chuàng)建數(shù)據(jù)庫和日志文件的目錄
mkdir c:datadb mkdir c:datalog創(chuàng)建配置文件
創(chuàng)建一個(gè)配置文件。該文件必須設(shè)置 systemLog.path 參數(shù),包括一些附加的配置選項(xiàng)更好。
例如,創(chuàng)建一個(gè)配置文件位于 C:mongodbmongod.cfg,其中指定 systemLog.path 和 storage.dbPath。具體配置內(nèi)容如下:
systemLog:destination: filepath: c:datalogmongod.log storage:dbPath: c:datadb4.1.4 安裝 MongoDB服務(wù)
通過執(zhí)行mongod.exe,使用--install選項(xiàng)來安裝服務(wù),使用--config選項(xiàng)來指定之前創(chuàng)建的配置文件。
C:mongodbbinmongod.exe --config "C:mongodbmongod.cfg" --install要使用備用 dbpath,可以在配置文件(例如:C:mongodbmongod.cfg)或命令行中通過 --dbpath 選項(xiàng)指定。
如果需要,您可以安裝 mongod.exe 或 mongos.exe 的多個(gè)實(shí)例的服務(wù)。只需要通過使用 --serviceName 和 --serviceDisplayName 指定不同的實(shí)例名。只有當(dāng)存在足夠的系統(tǒng)資源和系統(tǒng)的設(shè)計(jì)需要這么做。
啟動(dòng)MongoDB服務(wù)
net start MongoDB關(guān)閉MongoDB服務(wù)
net stop MongoDB移除 MongoDB 服務(wù)
C:mongodbbinmongod.exe --remove 命令行下運(yùn)行 MongoDB 服務(wù)器 和 配置 MongoDB 服務(wù) 任選一個(gè)方式啟動(dòng)就可以。任選一個(gè)操作就好
4.1.5 MongoDB 后臺(tái)管理 Shell
如果你需要進(jìn)入MongoDB后臺(tái)管理,你需要先打開mongodb裝目錄的下的bin目錄,然后執(zhí)行mongo.exe文件,MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對(duì)MongoDB進(jìn)行操作和管理的交互式環(huán)境。
當(dāng)你進(jìn)入mongoDB后臺(tái)后,它默認(rèn)會(huì)鏈接到 test 文檔(數(shù)據(jù)庫):
> mongo MongoDB shell version: 3.0.6 connecting to: test ……由于它是一個(gè)JavaScript shell,您可以運(yùn)行一些簡(jiǎn)單的算術(shù)運(yùn)算:
> 2 + 2 4 >db 命令用于查看當(dāng)前操作的文檔(數(shù)據(jù)庫):
> db test >插入一些簡(jiǎn)單的記錄并查找它:
> db.runoob.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.runoob.find() { "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 } >第一個(gè)命令將數(shù)字 10 插入到 runoob 集合的 x 字段中。
4.2 Linux平臺(tái)安裝MongoDB
MongoDB 提供了 linux 各發(fā)行版本 64 位的安裝包,你可以在官網(wǎng)下載安裝包。
下載地址:https://www.mongodb.com/download-center#community
下載完安裝包,并解壓 tgz(以下演示的是 64 位 Linux上的安裝) 。
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下載 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解壓mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 將解壓包拷貝到指定目錄MongoDB 的可執(zhí)行文件位于 bin 目錄下,所以可以將其添加到 PATH 路徑中:
export PATH=<mongodb-install-directory>/bin:$PATH<mongodb-install-directory> 為你 MongoDB 的安裝路徑。如本文的 /usr/local/mongodb 。
4.2.1 創(chuàng)建數(shù)據(jù)庫目錄
MongoDB的數(shù)據(jù)存儲(chǔ)在data目錄的db目錄下,但是這個(gè)目錄在安裝過程不會(huì)自動(dòng)創(chuàng)建,所以你需要手動(dòng)創(chuàng)建data目錄,并在data目錄中創(chuàng)建db目錄。
以下實(shí)例中我們將data目錄創(chuàng)建于根目錄下(/)。
注意:/data/db 是 MongoDB 默認(rèn)的啟動(dòng)的數(shù)據(jù)庫路徑(--dbpath)。
mkdir -p /data/db4.2.2 命令行中運(yùn)行 MongoDB 服務(wù)
你可以再命令行中執(zhí)行mongo安裝目錄中的bin目錄執(zhí)行mongod命令來啟動(dòng)mongdb服務(wù)。
注意:如果你的數(shù)據(jù)庫目錄不是/data/db,可以通過 --dbpath 來指定。$ ./mongod 2015-09-25T16:39:50.549+0800 I JOURNAL [initandlisten] journal dir=/data/db/journal 2015-09-25T16:39:50.550+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2015-09-25T16:39:50.869+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.16 2015-09-25T16:39:51.206+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.52 2015-09-25T16:39:52.775+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 7.74.2.3 MongoDB后臺(tái)管理 Shell
如果你需要進(jìn)入MongoDB后臺(tái)管理,你需要先打開mongodb裝目錄的下的bin目錄,然后執(zhí)行mongo命令文件。
MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對(duì)MongoDB進(jìn)行操作和管理的交互式環(huán)境。
當(dāng)你進(jìn)入mongoDB后臺(tái)后,它默認(rèn)會(huì)鏈接到 test 文檔(數(shù)據(jù)庫):
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell. ……由于它是一個(gè)JavaScript shell,您可以運(yùn)行一些簡(jiǎn)單的算術(shù)運(yùn)算:
> 2+2 4 > 3+6 9現(xiàn)在讓我們插入一些簡(jiǎn)單的數(shù)據(jù),并對(duì)插入的數(shù)據(jù)進(jìn)行檢索:
> db.runoob.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.runoob.find() { "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 } >第一個(gè)命令將數(shù)字 10 插入到 runoob 集合的 x 字段中。
4.2.4 MongoDb web 用戶界面
MongoDB 提供了簡(jiǎn)單的 HTTP 用戶界面。 如果你想啟用該功能,需要在啟動(dòng)的時(shí)候指定參數(shù) --rest 。
注意:該功能只適用于 MongoDB 3.2 及之前的早期版本。$ ./mongod --dbpath=/data/db --restMongoDB 的 Web 界面訪問端口比服務(wù)的端口多1000。
如果你的MongoDB運(yùn)行端口使用默認(rèn)的27017,你可以在端口號(hào)為28017訪問web用戶界面,即地址為:http://localhost:28017。
五、啟動(dòng)Mongodb服務(wù)
在你的安裝目錄/bin下,有一個(gè)叫mongod.exe的應(yīng)用程序,這個(gè)程序就是用來啟動(dòng)你的mongodb服務(wù)器的。
創(chuàng)建數(shù)據(jù)庫目錄
在你想要存放數(shù)據(jù)的地方,新建一個(gè)文件夾,如db,我們推薦的數(shù)據(jù)庫目錄設(shè)置是:
data/ conf -->配置文件目錄 mongod.conf -->配置文件 db -->數(shù)據(jù)庫目錄 log -->日志文件目錄 mongodb.log -->日志記錄文件啟動(dòng)數(shù)據(jù)庫
我本地是window10環(huán)境,我的mongodb服務(wù)安裝在F盤的mongodb文件夾。我的數(shù)據(jù)目錄在F的data文件夾。
啟動(dòng)doc命令,輸入一下命令:
F:>mongodb/bin F:mongodbbin>mongod --path=/data/db輸出以下信息:
最后一行顯示"waiting for connections on port 27017",表明mongodb服務(wù)器已經(jīng)啟動(dòng),正在27017窗口等待連接。
再查看f:/data/db文件夾,已出現(xiàn)以下文件:
說明mongodb服務(wù)啟動(dòng)成功。
將MongoDB服務(wù)器作為Windows服務(wù)運(yùn)行
像上面那樣啟動(dòng)mongodb,發(fā)現(xiàn)沒辦法輸入命令行了,這是可以采用打開多個(gè)窗口來連接,但這樣就太麻煩了,解決辦法就是將MongoDB服務(wù)器作為Windows服務(wù)運(yùn)行。
輸入以下命令:
F:mongodbbin>mongod --dbpath "f:datadb" --logpath "f:datalogmongodb.log" --serviceName "mongodb" --serviceDisplayName "mongodb" --install看到了如下輸出:
2016-10-20T23:32:46.339+0800 I CONTROL log file "f:datalogmongodb.log" exists; moved to "f:datalogmongodb.log.2016-10-20T15-32-46".說明mongodb服務(wù)安裝成功。啟動(dòng)mongodb服務(wù):
F:mongodbbin>net start mongodb MongoDB 服務(wù)已經(jīng)啟動(dòng)成功。說明mongodb啟動(dòng)成功。
由于我們并沒有指定mongodb服務(wù)的端口號(hào),所以它啟動(dòng)在默認(rèn)的27017窗口。
打開瀏覽器,范圍地址http://127.0.0.1:27017/,可看到如下信息
It looks like you are trying to access MongoDB over HTTP on the native driver port.mongodb常用啟動(dòng)參數(shù)
mongod.exe常用參數(shù)如下:
mongod.exe的啟動(dòng)參數(shù),在window環(huán)境下和linux環(huán)境下并不相同,詳見mongod - mongodb啟動(dòng)服務(wù)工具。
六、MongoDB - 連接
6.1 啟動(dòng) MongoDB服務(wù)
在前面的教程中,我們已經(jīng)討論了如何啟動(dòng)MongoDB服務(wù),你只需要在MongoDB安裝目錄的bin目錄下執(zhí)行'mongod'即可。
執(zhí)行啟動(dòng)操作后,mongodb在輸出一些必要信息后不會(huì)輸出任何信息,之后就等待連接的建立,當(dāng)連接被建立后,就會(huì)開始打印日志信息。
你可以使用 MongoDB shell 來連接 MongoDB 服務(wù)器。你也可以使用 PHP 來連接 MongoDB。本教程我們會(huì)使用 MongoDB shell 來連接 Mongodb 服務(wù),之后的章節(jié)我們將會(huì)介紹如何通過php 來連接MongoDB服務(wù)。
6.2 通過shell連接MongoDB服務(wù)
你可以通過執(zhí)行以下命令來連接MongoDB的服務(wù)。
注意:localhost為主機(jī)名,這個(gè)選項(xiàng)是必須的:
mongodb://localhost
當(dāng)你執(zhí)行以上命令時(shí),你可以看到以下輸出結(jié)果:
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > mongodb://localhostmongodb://localhost ...這時(shí)候你返回查看運(yùn)行 ./mongod 命令的窗口,可以看到是從哪里連接到MongoDB的服務(wù)器,您可以看到如下信息:
……省略信息…… 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] allocator: tcmalloc 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/db" } } 2015-09-25T17:22:27.350+0800 I NETWORK [initandlisten] waiting for connections on port 27017 2015-09-25T17:22:36.012+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:37310 #1 (1 connection now open) # 該行表明一個(gè)來自本機(jī)的連接 ……省略信息……6.3 MongoDB連接命令格式
使用用戶名和密碼連接到MongoDB服務(wù)器,你必須使用 'username:password@hostname/dbname' 格式,'username'為用戶名,'password' 為密碼。
使用用戶名和密碼連接登陸到默認(rèn)數(shù)據(jù)庫:
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test mongodb://admin:123456@localhost/以上命令中,用戶 admin 使用密碼 123456 連接到本地的 MongoDB 服務(wù)上。輸出結(jié)果如下所示:<、p>
> mongodb://admin:123456@localhost/ ...使用用戶名和密碼連接登陸到指定數(shù)據(jù)庫:
連接到指定數(shù)據(jù)庫的格式如下:
mongodb://admin:123456@localhost/test
6.4 更多連接實(shí)例
連接本地?cái)?shù)據(jù)庫服務(wù)器,端口是默認(rèn)的。
mongodb://localhost
使用用戶名fred,密碼foobar登錄localhost的admin數(shù)據(jù)庫。
mongodb://fred:foobar@localhost
使用用戶名fred,密碼foobar登錄localhost的baz數(shù)據(jù)庫。
mongodb://fred:foobar@localhost/baz
連接 replica pair, 服務(wù)器1為http://example1.com服務(wù)器2為example2。
mongodb://example1.com:27017,http://example2.com:27017
連接 replica set 三臺(tái)服務(wù)器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
連接 replica set 三臺(tái)服務(wù)器, 寫入操作應(yīng)用在主服務(wù)器 并且分布查詢到從服務(wù)器。
mongodb://host1,host2,host3/?slaveOk=true
直接連接第一個(gè)服務(wù)器,無論是replica set一部分或者主服務(wù)器或者從服務(wù)器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
當(dāng)你的連接服務(wù)器有優(yōu)先級(jí),還需要列出所有服務(wù)器,你可以使用上述連接方式。
安全模式連接到localhost:
mongodb://localhost/?safe=true
以安全模式連接到replica set,并且等待至少兩個(gè)復(fù)制服務(wù)器成功寫入,超時(shí)時(shí)間設(shè)置為2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
6.5 參數(shù)選項(xiàng)說明
標(biāo)準(zhǔn)格式:
mongodb://[username:password@]host1:port1,...,hostN[:portN]][?options]]
標(biāo)準(zhǔn)的連接格式包含了多個(gè)選項(xiàng)(options),如下所示:
七、Mongodb的使用
7.1 MongoDB 創(chuàng)建數(shù)據(jù)庫
MongoDB 創(chuàng)建數(shù)據(jù)庫的語法格式如下:
use DATABASE_NAME如果數(shù)據(jù)庫不存在,則創(chuàng)建數(shù)據(jù)庫,否則切換到指定數(shù)據(jù)庫。
以下實(shí)例我們創(chuàng)建了數(shù)據(jù)庫 mongo:
> use mongo switched to db mongo > db mongo >如果你想查看所有數(shù)據(jù)庫,可以使用 show dbs 命令:
> show dbs local 0.078GB test 0.078GB >可以看到,我們剛創(chuàng)建的數(shù)據(jù)庫 mongo 并不在數(shù)據(jù)庫的列表中, 要顯示它,我們需要向 mongo 數(shù)據(jù)庫插入一些數(shù)據(jù)。
> db.mongo.insert({"name":"mongodb中文網(wǎng)"}) WriteResult({ "nInserted" : 1 }) > show dbs local 0.078GB mongo 0.078GB test 0.078GB >MongoDB 中默認(rèn)的數(shù)據(jù)庫為 test,如果你沒有創(chuàng)建新的數(shù)據(jù)庫,集合將存放在 test 數(shù)據(jù)庫中。
7.2 MongoDB 刪除數(shù)據(jù)庫
MongoDB 刪除數(shù)據(jù)庫的語法格式如下:
db.dropDatabase()刪除當(dāng)前數(shù)據(jù)庫,默認(rèn)為 test,你可以使用 db 命令查看當(dāng)前數(shù)據(jù)庫名。
以下實(shí)例我們刪除了數(shù)據(jù)庫 mongo。
首先,查看所有數(shù)據(jù)庫:
> show dbs local 0.078GB mongo 0.078GB test 0.078GB接下來我們切換到數(shù)據(jù)庫 mongo
> use runoob switched to db mongo >執(zhí)行刪除命令:
> db.dropDatabase() { "dropped" : "runoob", "ok" : 1 }最后,我們?cè)偻ㄟ^ show dbs 命令數(shù)據(jù)庫是否刪除成功:
> show dbs local 0.078GB test 0.078GB >集合刪除語法格式如下:
db.collection.drop()7.3 MongoDB 插入文檔
插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:
db.COLLECTION_NAME.insert(document)實(shí)例
以下文檔可以存儲(chǔ)在 MongoDB 的 mongo 數(shù)據(jù)庫 的 col集合中:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫', by: 'MongoDB中文網(wǎng)', url: 'http://www.mongodb.org.cn', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })以上實(shí)例中 col 是我們的集合名,前一章節(jié)我們已經(jīng)創(chuàng)建過了,如果該集合不在該數(shù)據(jù)庫中, MongoDB 會(huì)自動(dòng)創(chuàng)建該集合并插入文檔。
查看已插入文檔:
> db.col.find() { "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "MongoDB中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >我們也可以將數(shù)據(jù)定義為一個(gè)變量,如下所示:
> document=({title: 'MongoDB 教程',description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫', by: 'Mongodb中文網(wǎng)', url: 'http://www.mongodb.org.cn', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 });執(zhí)行后顯示結(jié)果如下:
{ "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "Mongodb中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }執(zhí)行插入操作:
> db.col.insert(document) WriteResult({ "nInserted" : 1 }) >插入文檔你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會(huì)更新該 _id 的數(shù)據(jù)。
7.4 MongoDB 刪除文檔
語法
remove() 方法的基本語法格式如下所示:
db.collection.remove( <query>, <justOne> )如果你的 MongoDB 是 2.6 版本以后的,語法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )參數(shù)說明:
- query :(可選)刪除的文檔的條件。
- justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔。
- writeConcern :(可選)拋出異常的級(jí)別。
實(shí)例
以下文檔我們執(zhí)行兩次插入操作:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫', by: 'MongoDB中文網(wǎng)', url: 'http://www.mongodb.org.cn', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })使用 find() 函數(shù)查詢數(shù)據(jù):
> db.col.find() { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "MongoDB中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "MongoDB中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }接下來我們移除 title 為 'MongoDB 教程' 的文檔:
>db.col.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數(shù)據(jù) >db.col.find() …… # 沒有數(shù)據(jù)如果你只想刪除第一條找到的記錄可以設(shè)置 justOne 為 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)如果你想刪除所有數(shù)據(jù),可以使用以下方式(類似常規(guī) SQL 的 truncate 命令):
>db.col.remove({}) >db.col.find() >7.5 MongoDB 更新文檔
update() 方法
update() 方法用于更新已存在的文檔。語法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )參數(shù)說明:
- query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
- update : update的對(duì)象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的
- upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
- multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
我們?cè)诩?col 中插入如下數(shù)據(jù):
>db.col.insert({ title: 'Mongodb 教程', description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫', by: 'Mongodb中文網(wǎng)', url: 'http://www.mongodb.org.cn', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })接著我們通過 update() 方法來更新標(biāo)題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息 > db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "Mongodb中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >可以看到標(biāo)題(title)由原來的 "MongoDB 教程" 更新為了 "MongoDB"。
以上語句只會(huì)修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設(shè)置 multi 參數(shù)為 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})save() 方法
save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save( <document>, { writeConcern: <document> } )參數(shù)說明:
- document : 文檔數(shù)據(jù)。
- writeConcern :可選,拋出異常的級(jí)別。
實(shí)例
以下實(shí)例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):
>db.col.save({ "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "MongoDB中文網(wǎng)", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } )替換成功后,我們可以通過 find() 命令來查看替換后的數(shù)據(jù)
>db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "Mongo", "url" : "http://www.mongodb.org.cn", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } >更多實(shí)例
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );只添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );全部添加加進(jìn)去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );更多mongodb操作查看 https://www.mongodb.org.cn/manual/>
7.6 MongoDB 查詢文檔
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結(jié)構(gòu)化的方式來顯示所有文檔。
語法
MongoDB 查詢數(shù)據(jù)的語法格式如下:
db.collection.find(query, projection)- query :可選,使用查詢操作符指定查詢條件
- projection :可選,使用投影操作符指定返回的鍵。查詢時(shí)返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認(rèn)省略)。
如果你需要以易讀的方式來讀取數(shù)據(jù),可以使用 pretty() 方法,語法格式如下:
>db.col.find().pretty()pretty() 方法以格式化的方式來顯示所有文檔。
實(shí)例
以下實(shí)例我們查詢了集合 col 中的數(shù)據(jù):
> db.col.find().pretty() {"_id" : ObjectId("56063f17ade2f21f36b03133"),"title" : "MongoDB 教程","description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 }除了 find() 方法之外,還有一個(gè) findOne() 方法,它只返回一個(gè)文檔。
7.6.1 MongoDB 與 RDBMS Where 語句比較
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過下表可以更好的理解 MongoDB 的條件語句查詢:
7.6.2 MongoDB AND 條件
MongoDB 的 find() 方法可以傳入多個(gè)鍵(key),每個(gè)鍵(key)以逗號(hào)隔開,即常規(guī) SQL 的 AND 條件。
語法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()實(shí)例
以下實(shí)例通過 by 和 title 鍵來查詢 菜鳥教程 中 MongoDB 教程 的數(shù)據(jù)
> db.col.find({"by":"菜鳥教程", "title":"MongoDB 教程"}).pretty() {"_id" : ObjectId("56063f17ade2f21f36b03133"),"title" : "MongoDB 教程","description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 }以上實(shí)例中類似于 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'
7.6.3 MongoDB OR 條件
MongoDB OR 條件語句使用了關(guān)鍵字 $or,語法格式如下:
>db.col.find({$or: [{key1: value1}, {key2:value2}]} ).pretty()實(shí)例
以下實(shí)例中,我們演示了查詢鍵 by 值為 菜鳥教程 或鍵 title 值為 MongoDB 教程 的文檔。
>db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty() {"_id" : ObjectId("56063f17ade2f21f36b03133"),"title" : "MongoDB 教程","description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 } >AND 和 OR 聯(lián)合使用
以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語句為: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty() {"_id" : ObjectId("56063f17ade2f21f36b03133"),"title" : "MongoDB 教程","description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫","by" : "菜鳥教程","url" : "http://www.runoob.com","tags" : ["mongodb","database","NoSQL"],"likes" : 100 }7.7 MongoDB 條件操作符
描述
條件操作符用于比較兩個(gè)表達(dá)式并從mongoDB集合中獲取數(shù)據(jù)。
在本章節(jié)中,我們將討論如何在MongoDB中使用條件操作符。
MongoDB中條件操作符有:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
我們使用的數(shù)據(jù)庫名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。
為了方便測(cè)試,我們可以先使用以下命令清空集合 "col" 的數(shù)據(jù):
db.col.remove({})插入以下數(shù)據(jù)
>db.col.insert({title: 'PHP 教程', description: 'PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['php'],likes: 200 }) >db.col.insert({title: 'Java 教程', description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['java'],likes: 150 }) >db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['mongodb'],likes: 100 })使用find()命令查看數(shù)據(jù):
> db.col.find() { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }7.7.1 MongoDB (>) 大于操作符 - $gt
如果你想獲取 "col" 集合中 "likes" 大于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$gt : 100}})類似于SQL語句:
Select * from col where likes > 100;輸出結(jié)果:
> db.col.find({likes : {$gt : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } >7.7.2 MongoDB(>=)大于等于操作符 - $gte
如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$gte : 100}})類似于SQL語句:
Select * from col where likes >=100;輸出結(jié)果:
> db.col.find({likes : {$gte : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } >7.7.3 MongoDB (<) 小于操作符 - $lt
如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt : 150}})類似于SQL語句:
Select * from col where likes < 150;輸出結(jié)果:
> db.col.find({likes : {$lt : 150}}) { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }7.7.4 MongoDB (<=) 小于等于操作符 - $lte
如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lte : 150}})類似于SQL語句:
Select * from col where likes <= 150;輸出結(jié)果:
> db.col.find({likes : {$lte : 150}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }7.7.5 MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt
如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:
db.col.find({likes : {$lt :200, $gt : 100}})類似于SQL語句:
Select * from col where likes>100 AND likes<200;輸出結(jié)果:
> db.col.find({likes : {$lt :200, $gt : 100}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } >7.8 MongoDB $type 操作符
描述
在本章節(jié)中,我們將繼續(xù)討論MongoDB中條件操作符 $type。
$type操作符是基于BSON類型來檢索集合中匹配的數(shù)據(jù)類型,并返回結(jié)果。
MongoDB 中可以使用的類型如下表所示:
我們使用的數(shù)據(jù)庫名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。
簡(jiǎn)單的集合"col":
>db.col.insert({title: 'PHP 教程', description: 'PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['php'],likes: 200 }) >db.col.insert({title: 'Java 教程', description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['java'],likes: 150 }) >db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫',by: '菜鳥教程',url: 'http://www.runoob.com',tags: ['mongodb'],likes: 100 })使用find()命令查看數(shù)據(jù):
> db.col.find() { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }MongoDB 操作符 - $type 實(shí)例
如果想獲取 "col" 集合中 title 為 String 的數(shù)據(jù),你可以使用以下命令:
db.col.find({"title" : {$type : 2}}) 或 db.col.find({"title" : {$type : 'string'}})輸出結(jié)果為:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }7.9 MongoDB Limit與Skip方法
7.9.1 MongoDB Limit() 方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語法
limit()方法基本語法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)實(shí)例
集合 col 中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }以下實(shí)例為顯示查詢文檔中的兩條記錄:
> db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" } >注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
7.9.2 MongoDB Skip() 方法
我們除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過的記錄條數(shù)。
語法
skip() 方法腳本語法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)實(shí)例
以下實(shí)例只會(huì)顯示第二條文檔數(shù)據(jù)
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1) { "title" : "Java 教程" } >注:skip()方法默認(rèn)參數(shù)為 0 。
8.0 MongoDB 排序
MongoDB sort() 方法
在 MongoDB 中使用 sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序,sort() 方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
語法
sort()方法基本語法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})實(shí)例
col 集合中的數(shù)據(jù)如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動(dòng)態(tài)交互性站點(diǎn)的強(qiáng)有力的服務(wù)器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級(jí)程序設(shè)計(jì)語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }以下實(shí)例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列:
>db.col.find({},{"title":1,_id:0}).sort({"likes":-1}) { "title" : "PHP 教程" } { "title" : "Java 教程" } { "title" : "MongoDB 教程" } >八、 MongoDB 之spring-mvc整合
參考https://blog.csdn.net/hh12211221/article/details/77717364文章
九、 MongoDB 之springboot整合
9.1 導(dǎo)入依賴
<dependencies><!--spring-boot起步依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!--實(shí)體--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version></dependency> </dependencies>9.2 配置文件
spring.application.name=mongodb_demo server.port=8080 ? ? spring.data.mongodb.uri=mongodb://localhost:27017/test9.3 DAO層
package com.hellojava.dao; ? ? ? import com.hellojava.model.MongoTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Component; ? @Component public class MongoTestDao { ? ?@Autowiredprivate MongoTemplate mongoTemplate; ?/*** 創(chuàng)建對(duì)象*/public void saveTest(MongoTest test) {mongoTemplate.save(test);} ?/*** 根據(jù)用戶名查詢對(duì)象* @return*/public MongoTest findTestByName(String name) {Query query=new Query(Criteria.where("name").is(name));MongoTest mgt = mongoTemplate.findOne(query , MongoTest.class);return mgt;} ?/*** 更新對(duì)象*/public void updateTest(MongoTest test) {Query query=new Query(Criteria.where("id").is(test.getId()));Update update= new Update().set("age", test.getAge()).set("name", test.getName());//更新查詢返回結(jié)果集的第一條mongoTemplate.updateFirst(query,update,MongoTest.class);//更新查詢返回結(jié)果集的所有// mongoTemplate.updateMulti(query,update,TestEntity.class);} ?/*** 刪除對(duì)象* @param id*/public void deleteTestById(Integer id) {Query query=new Query(Criteria.where("id").is(id));mongoTemplate.remove(query,MongoTest.class);} }總結(jié)
以上是生活随笔為你收集整理的mongodb连接失败_MongoDB 基础入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python猜数游戏流程_Python
- 下一篇: Python 统计一行字符中单词的个数_