MongoDB基礎(chǔ)

備注:本文非原創(chuàng)搭幻,參考自以下文章
https://blog.csdn.net/hayre/article/details/80628431
https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

一咧擂、為什么要使用MongoDB?

1檀蹋、MongoDB提出的是文檔松申、集合的概念,使用BSON(類(lèi)JSON)作為其數(shù)據(jù)模型結(jié)構(gòu)俯逾,其結(jié)構(gòu)是面向?qū)ο蟮亩皇嵌S表贸桶,存儲(chǔ)一個(gè)用戶(hù)在MongoDB中是這樣子的。

{
    username:'123',
    password:'123'
}

使用這樣的數(shù)據(jù)模型桌肴,使得MongoDB能在生產(chǎn)環(huán)境中提供高讀寫(xiě)的能力皇筛,吞吐量較于mysql等SQL數(shù)據(jù)庫(kù)大大增強(qiáng)。

2坠七、易伸縮水醋,自動(dòng)故障轉(zhuǎn)移旗笔。易伸縮指的是提供了分片能力,能對(duì)數(shù)據(jù)集進(jìn)行分片拄踪,數(shù)據(jù)的存儲(chǔ)壓力分?jǐn)偨o多臺(tái)服務(wù)器蝇恶。自動(dòng)故障轉(zhuǎn)移是副本集的概念,MongoDB能檢測(cè)主節(jié)點(diǎn)是否存活惶桐,當(dāng)失活時(shí)能自動(dòng)提升從節(jié)點(diǎn)為主節(jié)點(diǎn)撮弧,達(dá)到故障轉(zhuǎn)移。

3姚糊、數(shù)據(jù)模型因?yàn)槭敲嫦驅(qū)ο蟮幕哐埽钥梢员硎矩S富的、有層級(jí)的數(shù)據(jù)結(jié)構(gòu)叛拷,比如博客系統(tǒng)中能把“評(píng)論”直接懟到“文章“的文檔中舌厨,而不必像myqsl一樣創(chuàng)建三張表來(lái)描述這樣的關(guān)系。

二忿薇、主要特性

1裙椭、文檔數(shù)據(jù)類(lèi)型
SQL類(lèi)型的數(shù)據(jù)庫(kù)是正規(guī)化的,可以通過(guò)主鍵或者外鍵的約束保證數(shù)據(jù)的完整性與唯一性署浩,所以SQL類(lèi)型的數(shù)據(jù)庫(kù)常用于對(duì)數(shù)據(jù)完整性較高的系統(tǒng)揉燃。MongoDB在這一方面是不如SQL類(lèi)型的數(shù)據(jù)庫(kù),且MongoDB沒(méi)有固定的Schema筋栋,正因?yàn)镸ongoDB少了一些這樣的約束條件炊汤,可以讓數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)更靈活,存儲(chǔ)速度更加快弊攘。

2抢腐、即時(shí)查詢(xún)能力
MongoDB保留了關(guān)系型數(shù)據(jù)庫(kù)即時(shí)查詢(xún)的能力,保留了索引(底層是基于B tree)的能力襟交。這一點(diǎn)汲取了關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)迈倍,相比于同類(lèi)型的NoSQL redis 并沒(méi)有上述的能力。

3捣域、復(fù)制能力
MongoDB自身提供了副本集能將數(shù)據(jù)分布在多臺(tái)機(jī)器上實(shí)現(xiàn)冗余啼染,目的是可以提供自動(dòng)故障轉(zhuǎn)移、擴(kuò)展讀能力焕梅。

4迹鹅、速度與持久性
MongoDB的驅(qū)動(dòng)實(shí)現(xiàn)一個(gè)寫(xiě)入語(yǔ)義 fire and forget ,即通過(guò)驅(qū)動(dòng)調(diào)用寫(xiě)入時(shí)贞言,可以立即得到返回得到成功的結(jié)果(即使是報(bào)錯(cuò))斜棚,這樣讓寫(xiě)入的速度更加快,當(dāng)然會(huì)有一定的不安全性,完全依賴(lài)網(wǎng)絡(luò)弟蚀。
MongoDB提供了Journaling日志的概念脂新,實(shí)際上像mysql的bin-log日志,當(dāng)需要插入的時(shí)候會(huì)先往日志里面寫(xiě)入記錄粗梭,再完成實(shí)際的數(shù)據(jù)操作,這樣如果出現(xiàn)停電级零,進(jìn)程突然中斷的情況断医,可以保障數(shù)據(jù)不會(huì)錯(cuò)誤,可以通過(guò)修復(fù)功能讀取Journaling日志進(jìn)行修復(fù)奏纪。

5鉴嗤、數(shù)據(jù)擴(kuò)展
MongoDB使用分片技術(shù)對(duì)數(shù)據(jù)進(jìn)行擴(kuò)展,MongoDB能自動(dòng)分片序调、自動(dòng)轉(zhuǎn)移分片里面的數(shù)據(jù)塊醉锅,讓每一個(gè)服務(wù)器里面存儲(chǔ)的數(shù)據(jù)都是一樣大小。

三发绢、C/S服務(wù)模型

MongoDB核心服務(wù)器主要是通過(guò)mongod程序啟動(dòng)的硬耍,而且在啟動(dòng)時(shí)不需對(duì)MongoDB使用的內(nèi)存進(jìn)行配置,因?yàn)槠湓O(shè)計(jì)哲學(xué)是內(nèi)存管理最好是交給操作系統(tǒng)边酒,缺少內(nèi)存配置是MongoDB的設(shè)計(jì)亮點(diǎn)经柴,另外,還可通過(guò)mongos路由服務(wù)器使用分片功能墩朦。

MongoDB的主要客戶(hù)端是可以交互的js shell 通過(guò)mongo啟動(dòng)坯认,使用js shell能使用js直接與MongoDB進(jìn)行交流,像使用sql語(yǔ)句查詢(xún)mysql數(shù)據(jù)一樣使用js語(yǔ)法查詢(xún)MongoDB的數(shù)據(jù)氓涣,另外還提供了各種語(yǔ)言的驅(qū)動(dòng)包牛哺,方便各種語(yǔ)言的接入。

四劳吠、完善的命令行工具

mongodump和mongorestore,備份和恢復(fù)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)工具引润。輸出BSON格式,遷移數(shù)據(jù)庫(kù)赴背。

mongoexport和mongoimport椰拒,用來(lái)導(dǎo)入導(dǎo)出JSON、CSV和TSV數(shù)據(jù)凰荚,數(shù)據(jù)需要支持多格式時(shí)有用燃观。mongoimport還能用與大數(shù)據(jù)集的初始導(dǎo)入,但是在導(dǎo)入前順便還要注意一下便瑟,為了能充分利用好mongoDB通常需要對(duì)數(shù)據(jù)模型做一些調(diào)整缆毁。

五、MongoDB 常用操作

更多內(nèi)容可查閱此文:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

1到涂、相關(guān)概念對(duì)比

SQL術(shù)語(yǔ)/概念 MongoDB術(shù)語(yǔ)/概念 解釋/說(shuō)明
database database 數(shù)據(jù)庫(kù)
table collection 數(shù)據(jù)庫(kù)表/集合
row document 數(shù)據(jù)記錄行/文檔
column field 數(shù)據(jù)字段/域
index index 索引
table joins 表連接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵

?
2脊框、創(chuàng)建數(shù)據(jù)庫(kù)

use DATABASE_NAME

如果數(shù)據(jù)庫(kù)不存在颁督,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)浇雹。
?
3沉御、刪除數(shù)據(jù)庫(kù)

db.dropDatabase()

刪除當(dāng)前數(shù)據(jù)庫(kù),默認(rèn)為 test昭灵,你可以使用 db 命令查看當(dāng)前數(shù)據(jù)庫(kù)名吠裆。
?
4、創(chuàng)建集合

db.createCollection(name, options)

參數(shù)說(shuō)明:
name: 要?jiǎng)?chuàng)建的集合名稱(chēng)
options: 可選參數(shù), 指定有關(guān)內(nèi)存大小及索引的選項(xiàng)

其實(shí)在 MongoDB 中烂完,你不需要?jiǎng)?chuàng)建集合试疙。當(dāng)你插入一些文檔時(shí),MongoDB 會(huì)自動(dòng)創(chuàng)建集合抠蚣。

> db.mycol2.insert({"name" : "菜鳥(niǎo)教程"})
> show collections
mycol2

?
5祝旷、刪除集合

db.collection_1.drop()

?
6、插入文檔
文檔的數(shù)據(jù)結(jié)構(gòu)和 JSON 基本一樣嘶窄。
所有存儲(chǔ)在集合中的數(shù)據(jù)都是 BSON 格式怀跛。
BSON 是一種類(lèi)似 JSON 的二進(jìn)制形式的存儲(chǔ)格式,是 Binary JSON 的簡(jiǎn)稱(chēng)护侮。

db.COLLECTION_NAME.insert(document)
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)',
    by: '菜鳥(niǎo)教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

插入文檔你也可以使用 db.col.save(document) 命令敌完。如果不指定 _id 字段 save() 方法類(lèi)似于 insert() 方法。如果指定 _id 字段羊初,則會(huì)更新該 _id 的數(shù)據(jù)滨溉。
?
7、更新文檔
update() 方法用于更新已存在的文檔长赞。語(yǔ)法格式如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

參數(shù)說(shuō)明:
query : update的查詢(xún)條件晦攒,類(lèi)似sql update查詢(xún)內(nèi)where后面的。
update : update的對(duì)象和一些更新的操作符(如,inc...)等得哆,也可以理解為sql update查詢(xún)內(nèi)set后面的
upsert : 可選脯颜,這個(gè)參數(shù)的意思是,如果不存在update的記錄贩据,是否插入objNew,true為插入栋操,默認(rèn)是false,不插入饱亮。
multi : 可選矾芙,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新近上。
writeConcern :可選剔宪,拋出異常的級(jí)別。

db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})

?
8、查詢(xún)文檔

db.collection.find(query, projection)

query :可選葱绒,使用查詢(xún)操作符指定查詢(xún)條件
projection :可選感帅,使用投影操作符指定返回的鍵。查詢(xún)時(shí)返回文檔中所有鍵值地淀, 只需省略該參數(shù)即可(默認(rèn)省略)失球。
如果你需要以易讀的方式來(lái)讀取數(shù)據(jù),可以使用 pretty() 方法帮毁,語(yǔ)法格式如下:

>db.col.find().pretty()

如果你熟悉常規(guī)的 SQL 數(shù)據(jù)她倘,通過(guò)下表可以更好的理解 MongoDB 的條件語(yǔ)句查詢(xún):

操作 格式 范例 RDBMS中的類(lèi)似語(yǔ)句
等于 {<key>:<value>} db.col.find({"by":"菜鳥(niǎo)教程"}).pretty() where by = '菜鳥(niǎo)教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類(lèi)似常規(guī) SQL 語(yǔ)句為: 'where likes>50 AND (by = '菜鳥(niǎo)教程' OR title = 'MongoDB 教程')'

>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥(niǎo)教程"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個(gè) Nosql 數(shù)據(jù)庫(kù)",
        "by" : "菜鳥(niǎo)教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

?
9作箍、刪除文檔
執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來(lái)判斷執(zhí)行的條件是否正確,這是一個(gè)比較好的習(xí)慣前硫。

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

參數(shù)說(shuō)明:
query :(可選)刪除的文檔的條件胞得。
justOne : (可選)如果設(shè)為 true 或 1,則只刪除一個(gè)文檔屹电,如果不設(shè)置該參數(shù)阶剑,或使用默認(rèn)值 false,則刪除所有匹配條件的文檔危号。
writeConcern :(可選)拋出異常的級(jí)別牧愁。

備注:remove() 方法 并不會(huì)真正釋放空間。
需要繼續(xù)執(zhí)行 db.repairDatabase() 來(lái)回收磁盤(pán)空間外莲。

> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })

remove() 方法已經(jīng)過(guò)時(shí)了猪半,現(xiàn)在官方推薦使用 deleteOne() 和 deleteMany() 方法。

如刪除集合下全部文檔:
db.inventory.deleteMany({})
刪除 status 等于 A 的全部文檔:
db.inventory.deleteMany({ status : "A" })
刪除 status 等于 D 的一個(gè)文檔:
db.inventory.deleteOne( { status: "D" } )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偷线,一起剝皮案震驚了整個(gè)濱河市磨确,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌声邦,老刑警劉巖乏奥,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亥曹,居然都是意外死亡邓了,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)媳瞪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骗炉,“玉大人,你說(shuō)我怎么就攤上這事材失『埙ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笼呆。 經(jīng)常有香客問(wèn)我熊响,道長(zhǎng),這世上最難降的妖魔是什么诗赌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任汗茄,我火速辦了婚禮,結(jié)果婚禮上铭若,老公的妹妹穿的比我還像新娘洪碳。我一直安慰自己,他們只是感情好叼屠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布瞳腌。 她就那樣靜靜地躺著,像睡著了一般镜雨。 火紅的嫁衣襯著肌膚如雪嫂侍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天荚坞,我揣著相機(jī)與錄音挑宠,去河邊找鬼。 笑死颓影,一個(gè)胖子當(dāng)著我的面吹牛各淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诡挂,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碎浇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了璃俗?” 一聲冷哼從身側(cè)響起南捂,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旧找,沒(méi)想到半個(gè)月后溺健,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钮蛛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年鞭缭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏颓。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岭辣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出甸饱,到底是詐尸還是另有隱情沦童,我是刑警寧澤仑濒,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站偷遗,受9級(jí)特大地震影響墩瞳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氏豌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一喉酌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泵喘,春花似錦泪电、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鲜锚,卻和暖如春和蚪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烹棉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怯疤,地道東北人浆洗。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像集峦,于是被迫代替她去往敵國(guó)和親伏社。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 一塔淤、簡(jiǎn)介 MongoDB 是一個(gè)基于分布式 文件存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù)摘昌。由 C++ 語(yǔ)言編寫(xiě)。旨在為 WEB 應(yīng)用...
    AaronSimon閱讀 365評(píng)論 0 1
  • 1. 介紹高蜂、安裝聪黎、使用(簡(jiǎn)單寫(xiě)寫(xiě),不做詳細(xì)介紹) 1.1 介紹 Mongodb是屬于NoSql的一種數(shù)據(jù)類(lèi)型备恤; M...
    Grace_ji閱讀 1,556評(píng)論 0 0
  • 微服務(wù)流行稿饰,我也是越來(lái)越喜歡MongoDB了,除非必要要用MySQL露泊,我都會(huì)傾向于MongoDB喉镰。 MongoDB...
    馮文議閱讀 488評(píng)論 0 0
  • MongoDB 非關(guān)系型數(shù)據(jù)庫(kù) 三,關(guān)系數(shù)據(jù)庫(kù)的重要概念 1)關(guān)系模型:關(guān)系(二位表)來(lái)表達(dá)數(shù)據(jù)及數(shù)據(jù)之間的聯(lián)系 ...
    dushuzhong閱讀 790評(píng)論 0 0
  • MongoDB介紹 MongoDB是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源文檔數(shù)據(jù)庫(kù)惭笑。由C++語(yǔ)言編寫(xiě)侣姆。旨在為WEB應(yīng)用提供...
    小廚筆記閱讀 1,312評(píng)論 0 2