MongoDB快速入門

一表悬、NoSQL概述

NoSQL是Not Only SQL的縮寫胜卤,指的是非關(guān)系型數(shù)據(jù)庫,與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫相對應(yīng)综膀,主要用于超大規(guī)模數(shù)據(jù)的存儲澳迫。

與RDBMS相比,具有如下特點:

  • 沒有聲明性查詢語言
  • 沒有預(yù)定義模式
  • 鍵值對存儲
  • 最終一致性
  • 非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
  • CAP定理
  • 高性能和可伸縮性

優(yōu)點:高可擴(kuò)展性剧劝;分布式計算橄登;低成本;半結(jié)構(gòu)化數(shù)據(jù)讥此;關(guān)系簡單拢锹。

缺點:沒有標(biāo)準(zhǔn)化;查詢功能有限萄喳;最終一致性沒有ACID直觀卒稳。

二、MongoDB概述

MongoDB是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)取胎,為Web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案展哭。將數(shù)據(jù)存儲為一個文檔湃窍,數(shù)據(jù)結(jié)構(gòu)由鍵值對組成闻蛀。存儲的數(shù)據(jù)與應(yīng)用的數(shù)據(jù),在格式上(JSON)高度一致您市。

主要特點:

  • 面向文檔存儲觉痛,操作簡單
  • 可以設(shè)置任何屬性的索引
  • 支持豐富的查詢表達(dá)式
  • 允許在服務(wù)端執(zhí)行腳本
  • 支持各種編程語言
  • 具有更高的擴(kuò)展性
  • 可以將負(fù)載分布在各個節(jié)點

官網(wǎng)地址

三、主要概念

1茵休、數(shù)據(jù)庫database

與RDBMS的概念相同薪棒。MongoDB的默認(rèn)數(shù)據(jù)庫為“db”手蝎,存儲在data目錄中。不同的數(shù)據(jù)庫放置在不同的文件中俐芯。

數(shù)據(jù)庫名稱的限制:

  • 不能是空字符串
  • 不能包含空格棵介、“.”、“/”吧史、“\”邮辽、“$”、空字符等
  • 應(yīng)該全部小寫
  • 最長64個字節(jié)

保留的數(shù)據(jù)庫名稱:

  • admin贸营,相當(dāng)于一個root數(shù)據(jù)庫吨述,如果將用戶添加到該數(shù)據(jù)庫,那么該用戶將自動獲得所有數(shù)據(jù)庫的權(quán)限
  • local钞脂,這個數(shù)據(jù)庫不會被復(fù)制揣云,可以用來存儲僅限于本地單個服務(wù)器的任意集合
  • config,當(dāng)Mongo用于分片設(shè)置時冰啃,該數(shù)據(jù)庫在內(nèi)部使用邓夕,用來保存分片的相關(guān)信息

2、集合collection

相當(dāng)于RDBMS中“表”的概念亿笤。集合沒有固定的結(jié)構(gòu)翎迁,可以插入不同格式和類型的數(shù)據(jù)。數(shù)據(jù)庫的信息存儲在dbname.system命名空間下的特殊集合中净薛。

集合名稱的限制:

  • 不能是空字符串
  • 不能包含空字符汪榔,空字符表示集合名的結(jié)尾
  • 不能以system開頭,屬于系統(tǒng)保留的前綴
  • 不能包含保留字符

3肃拜、文檔document

相當(dāng)于RDBMS中“行”的概念痴腌。MongoDB的文檔不需要設(shè)置相同的字段,并且相同字段不需要相同的數(shù)據(jù)類型燃领。文檔的數(shù)據(jù)結(jié)構(gòu)采用BSON格式士聪,和JSON基本相同,BSON是一種類json的二進(jìn)制形式的存儲格式猛蔽。

使用文檔時需要注意:

  • 文檔中的鍵值對是有序的
  • 文檔中的值可以是任意數(shù)據(jù)類型
  • 區(qū)分類型和大小寫
  • 不能有重復(fù)的鍵
  • 文檔的鍵是字符串

4剥悟、字段field

相當(dāng)于RDBMS中“列”的概念。

字段的常用類型:

  • String曼库,字符串類型区岗,在MongoDB中,UTF-8才是合法編碼
  • Integer毁枯,整形數(shù)值
  • Boolean慈缔,布爾值
  • Double,雙精度浮點值
  • Min/Max keys种玛,將一個值與BSON(二進(jìn)制的JSON)元素的最低值/最高值相比較
  • Arrays藐鹤,將數(shù)組或列表或多個值存儲為一個鍵
  • Timestamp瓤檐,時間戳,記錄文檔修改或添加的具體時間
  • Object娱节,用于內(nèi)嵌文檔
  • Null挠蛉,用于創(chuàng)建空值
  • Symbol,符號肄满,基本等同于字符串類型
  • Date碌秸,日期時間
  • Object ID,用于創(chuàng)建文檔的ID
  • Binary Data悄窃,用于存儲二進(jìn)制數(shù)據(jù)
  • Code讥电,代碼類型,用于在文檔中存儲JavaScript代碼
  • Regular expression轧抗,正則表達(dá)式類型恩敌,用于存儲正則表達(dá)式

5、索引index

與RDBMS的概念相同横媚。

6纠炮、主鍵primary key

自動將_id字段設(shè)置為主鍵。

7灯蝴、表連接

不支持表連接恢口,但可以通過嵌入文檔的方式實現(xiàn)。

四穷躁、用法

1耕肩、安裝

從官網(wǎng)下載并直接安裝,設(shè)置path環(huán)境變量问潭。

2猿诸、啟動

直接啟動:

mongod

指定配置文件啟動:

mongod --config /etc/mongodb.conf

3、操作數(shù)據(jù)庫

創(chuàng)建數(shù)據(jù)庫:

use DATABASE_NAME

如果數(shù)據(jù)庫不存在狡忙,則創(chuàng)建數(shù)據(jù)庫梳虽,否則切換到指定的數(shù)據(jù)庫。

查看當(dāng)前數(shù)據(jù)庫:

db

查看所有數(shù)據(jù)庫:

show dbs

刪除當(dāng)前數(shù)據(jù)庫:

db.dropDatabase()

在刪除之前應(yīng)該使用db命令查看當(dāng)前數(shù)據(jù)庫名灾茁,或者使用use命令切換到要刪除的數(shù)據(jù)庫窜觉。

刪除集合:

db.collection.drop()

4、操作文檔

插入:

db.COLLECTION_NAME.insert(document)

如果集合不存在北专,MongoDB會自動創(chuàng)建該集合并插入文檔禀挫。如果不指定_id字段,save方法與insert方法類似逗余。如果指定_id字段特咆,save方法會更新該_id的數(shù)據(jù)季惩。

更新:

db.COLLECTION_NAME.update(query, update, {upsert:boolean, multi:boolean, writeConcern:document})
  • query录粱,更新的查詢條件腻格,相對于sql的where語句
  • update,更新的對象和操作符啥繁,相對于sql的set語句
  • upsert菜职,可選,如果要更新的記錄不存在旗闽,是否插入新記錄酬核,true為插入,默認(rèn)false為不插入
  • multi适室,可選嫡意,默認(rèn)false為只更新第一條記錄,如果為true捣辆,則全部更新
  • writeConcern蔬螟,可選,表示拋出異常的級別

通過傳入的文檔替換已有的文檔:

db.COLLECTION_NAME.save(document, {writeConcern:document})

刪除:

db.COLLECTION_NAME.remove(query, {justOne:boolean, writeConcern:document})
  • query汽畴,可選旧巾,要刪除的文檔的滿足條件
  • justOne,可選忍些,如果為true鲁猩,則只刪除一個文檔
  • writeConcern,可選罢坝,表示拋出異常的級別

如果不包含任何參數(shù)廓握,則刪除集合中的所有文檔。建議在執(zhí)行remove操作之前嘁酿,先執(zhí)行find命令來判斷執(zhí)行條件是否正確疾棵。

查詢:

db.COLLECTION_NAME.find()

如果希望格式化查詢的結(jié)果,可以使用pretty方法:

db.COLLECTION_NAME.find().pretty()

如果希望只返回一個文檔:

db.COLLECTION_NAME.findOne()

在find方法中痹仙,傳入多個鍵值對是尔,每個鍵值對之間以逗號分隔,等價于SQL中的and條件:

db.COLLECTION_NAME.find({key1:value1, key2:value2})

在find方法中开仰,使用關(guān)鍵字$or拟枚,等價于SQL中的or條件:

db.COLLECTION_NAME.find({$or:[{key1:value1, key2:value2}]})

在MongoDB中,有四種條件操作符众弓,分別是$gt恩溅、$lt、$gte谓娃、$lte脚乡,對應(yīng)SQL中的大于、小于、大于等于和小于等于奶稠。

db.COLLECTION_NAME.find({key: {$gt : value}})

還有一個條件操作符$type俯艰,用來判斷字段的類型:

db.COLLECTION_NAME.find({key: {$type : typeid}})

使用limit方法,指定要讀取的記錄數(shù)量:

db.COLLECTION_NAME.find().limit(NUMBER)

使用skip方法锌订,跳過指定數(shù)量的記錄竹握,參數(shù)默認(rèn)為0:

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

使用sort方法,指定排序的字段辆飘,參數(shù)為1表示升序啦辐,-1表示降序,默認(rèn)按照升序排列:

db.COLLECTION_NAME.find().sort({KEY:1})

使用aggregate方法蜈项,處理數(shù)據(jù)并返回計算后的數(shù)據(jù)結(jié)果:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

聚合操作包括:

  • $sum芹关,計算求和
  • $avg,計算平均值
  • $min紧卒,獲取最小值
  • $max充边,獲取最大值
  • $push,插入值到一個數(shù)組中
  • $addToSet常侦,插入值到一個數(shù)組中浇冰,但不創(chuàng)建副本
  • $first,根據(jù)排序獲取第一個文檔數(shù)據(jù)
  • $last聋亡,根據(jù)排序獲取最后一個文檔數(shù)據(jù)

在MongoDB中肘习,可以使用聚合管道,將文檔在一個管道處理完畢之后把結(jié)果傳遞給下一個管道處理坡倔。

常用的管道操作:

  • $project漂佩,修改輸入文檔的結(jié)構(gòu),可以用來重命名罪塔、增加或刪除字段投蝉,也可以用來創(chuàng)建計算結(jié)果以及嵌套文檔
  • $match,用于過濾數(shù)據(jù)征堪,只輸出符合條件的文檔
  • $limit瘩缆,用來限制聚合管道返回的文檔數(shù)
  • $skip,在聚合管道中跳過指定數(shù)量的文檔
  • $unwind佃蚜,將文檔中的某一個數(shù)組類型字段拆分成多條庸娱,每條包含數(shù)組中的一個值
  • $group,將集合中的文檔分組谐算,用于統(tǒng)計結(jié)果
  • $sort熟尉,將輸入文檔進(jìn)行排序之后輸出
  • $geoNear,輸出接近某一地理位置的有序文檔

索引是特殊的數(shù)據(jù)結(jié)構(gòu)洲脂,存儲在一個易于遍歷讀取的數(shù)據(jù)集合中斤儿,是對數(shù)據(jù)庫表中的若干字段的值進(jìn)行排序的一種結(jié)構(gòu)。MongoDB還提供多個可選參數(shù),用來限定索引的規(guī)則往果。

創(chuàng)建索引:

db.COLLECTION_NAME.ensureIndex({KEY:1})

5疆液、數(shù)據(jù)庫的備份和恢復(fù)

復(fù)制:將數(shù)據(jù)同步在多個服務(wù)器的過程。提供了數(shù)據(jù)的冗余備份棚放,并在多個服務(wù)器上存儲數(shù)據(jù)副本。允許從硬件故障和服務(wù)中斷中恢復(fù)數(shù)據(jù)馅闽。復(fù)制至少需要兩個節(jié)點飘蚯,其中一個是主節(jié)點,負(fù)責(zé)處理客戶端請求福也,其余都是從節(jié)點局骤,負(fù)責(zé)復(fù)制主節(jié)點的數(shù)據(jù)。

分片:當(dāng)存儲海量數(shù)據(jù)時暴凑,一臺機(jī)器不足以存儲數(shù)據(jù)峦甩,也不足以提供可接受的讀寫量∠衷可以通過在多臺機(jī)器上分割數(shù)據(jù)凯傲,使得數(shù)據(jù)庫系統(tǒng)能夠存儲和處理更多的數(shù)據(jù)。Shard用于存儲實際的數(shù)據(jù)塊嗦篱,實際使用中一個shard server可以由幾臺機(jī)器組成冰单。Config server存儲整個ClusterMetadata,其中包括chunk信息灸促。Query routers前端路由诫欠,客戶端由此接入。

備份:在MongoDB中浴栽,可以使用mongodump命令來備份數(shù)據(jù)荒叼,該命令可以導(dǎo)出所有數(shù)據(jù)到指定目錄。

mongodump -h dbhost -d dbname -o dbdirectory

恢復(fù):在MongoDB中典鸡,可以使用mongorestore命令來恢復(fù)備份的數(shù)據(jù)被廓。

mongorestore -h dbhost -d dbname --directoryperdb dbdirectory

6、數(shù)據(jù)庫的監(jiān)控

在安裝部署并啟動MongoDB服務(wù)后萝玷,必須了解運行情況伊者,并查看其性能。

mongostat是MongoDB自帶的狀態(tài)檢測工具间护。mongotop用來跟蹤一個MongoDB實例亦渗,查看讀寫所花費的時間。這兩個工具都位于MongoDB的安裝目錄的bin目錄下汁尺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末法精,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搂蜓,老刑警劉巖狼荞,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帮碰,居然都是意外死亡相味,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門殉挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰涉,“玉大人,你說我怎么就攤上這事斯碌∫凰溃” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵傻唾,是天一觀的道長投慈。 經(jīng)常有香客問我,道長冠骄,這世上最難降的妖魔是什么伪煤? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凛辣,結(jié)果婚禮上带族,老公的妹妹穿的比我還像新娘。我一直安慰自己蟀给,他們只是感情好蝙砌,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跋理,像睡著了一般择克。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上前普,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天肚邢,我揣著相機(jī)與錄音,去河邊找鬼拭卿。 笑死骡湖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的峻厚。 我是一名探鬼主播响蕴,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惠桃!你這毒婦竟也來了浦夷?” 一聲冷哼從身側(cè)響起辖试,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劈狐,沒想到半個月后罐孝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡肥缔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年莲兢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续膳。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡改艇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姑宽,到底是詐尸還是另有隱情遣耍,我是刑警寧澤闺阱,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布炮车,位于F島的核電站,受9級特大地震影響酣溃,放射性物質(zhì)發(fā)生泄漏瘦穆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一赊豌、第九天 我趴在偏房一處隱蔽的房頂上張望扛或。 院中可真熱鬧,春花似錦碘饼、人聲如沸熙兔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽住涉。三九已至,卻和暖如春钠绍,著一層夾襖步出監(jiān)牢的瞬間舆声,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工柳爽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留媳握,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓磷脯,卻偏偏與公主長得像蛾找,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赵誓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容