MongoDB Base

下載地址 https://www.mongodb.com/download-center

MongoDB是CS架構(gòu)的郁惜,使用前需啟動服務(wù)端穴墅。

啟動服務(wù)端

  • mongod run 直接啟動
  • mongod --dbpath=DBPATH 指定特定數(shù)據(jù)存儲目錄啟動圆凰,若目錄不存在則創(chuàng)建劣针。
  • mongod --logpath=LOGFILE 指定特定日志文件
  • mongod --dbport=DBPORT 指定特定端口啟動铃辖,默認(rèn)27017.

Wins中默認(rèn)數(shù)據(jù)存放目錄 C:\data\db
Linux中默認(rèn)數(shù)據(jù)存儲目錄 /data/db

啟動服務(wù)端時指定存儲目錄并啟動

  • 將MongoDB作為Windows服務(wù)隨機(jī)啟動
$ mongod --dbpath=D:\data\db --logpath=D:\data\log\mongodb.log --dbport=27017 --install
Error parsing command line: unrecognised option '--dbport=27017'
try 'mongod --help' for more information

先要創(chuàng)建對應(yīng)的db目錄和log目錄

$ mongod --dbpath=D:\data\db --logpath=D:\data\log\mongodb.log --port=27017 --install
2019-12-24T17:01:32.976+0800 F  CONTROL  [main] Failed global initialization: FileNotOpen: Failed to open "D:\data\log\mongodb.log"

查看日志文件

Error connecting to the Service Control Manager: 拒絕訪問崭别。 (5)

cmd沒有用管理員權(quán)限

$ mongod.exe --bind_ip 127.0.0.1 --logpath "D:\data\log\mongodb.log" --logappend --dbpath "C:\data\db" --serviceName "Mongodb" --serviceDisplayName "MongoDB" --install

進(jìn)入CMD使用services.msc打開服務(wù)找到MongoDB姜性,設(shè)置服務(wù)狀態(tài)瞪慧。

  • 將MongoDB作為Linux服務(wù)隨機(jī)啟動
# 創(chuàng)建mongodb日志文件
> touch /var/logs/mongodb.log

# mongodb隨機(jī)啟動
> vi /etc/rc.local
mongod --dbpath=/var/data/db --dblog=/var/logs/mongodb.log --dbport=27017

# 客戶端連接
> mongo

瀏覽器輸入 http://127.0.0.1:27017

It looks like you are trying to access MongoDB over HTTP on the native driver port.

請求與連接

MongoDB數(shù)據(jù)庫會為每個連接創(chuàng)建一個隊列,存放該連接的請求部念。當(dāng)客戶端發(fā)送一個請求會被放到隊列末尾弃酌。只有隊列中的請求都執(zhí)行完畢,后續(xù)的請求才會執(zhí)行儡炼。所以從單個連接就可以了解整個數(shù)據(jù)庫妓湘,并且它總是能讀到自己寫的東西。

每個隊列都有獨立的乌询,打開兩個shell就有兩個數(shù)據(jù)庫連接榜贴。在一個shell中執(zhí)行插入之后在另一個查詢,不一定能得到插入的文檔妹田。然而唬党,在同一個shell中,插入后再進(jìn)行查詢是一定能查詢到的鬼佣。在繁忙的服務(wù)器上驶拱,交錯的插入或查詢顯得稀松平常。當(dāng)開發(fā)者用一個線程插入數(shù)據(jù)晶衷,用另一個線程檢查是否成功插入時蓝纲,會經(jīng)常遇到這種問題阴孟。有那么一兩秒時間好像根本就沒插入數(shù)據(jù),但隨后數(shù)據(jù)又突然冒出來税迷。

使用Ruby温眉、Python、Java驅(qū)動程序時,要特別注意這種行為,因為語言的驅(qū)動都使用了連接池百框。為提高效率衫嵌,驅(qū)動程序和服務(wù)器建立了多個連接(連接池),并將請求分散到這些連接中砂心,好在它們都提供了一些機(jī)制來確保一系列的請求都由一個連接來處理懈词。

體系結(jié)構(gòu)

一個運行著的MongoDB數(shù)據(jù)庫可看成是一個MongoDB Server,該Server由實例和數(shù)據(jù)庫組成辩诞。數(shù)據(jù)庫是由一系列與磁盤相關(guān)的物理文件坎弯。

數(shù)據(jù)邏輯結(jié)構(gòu)

MongoDB 數(shù)據(jù)邏輯層次結(jié)構(gòu) - 由 database 組成,databasecollections 組成译暂,collectionsdocuments 組成抠忘,而 documentsfields 組成。

MongoDB 數(shù)據(jù)邏輯層次結(jié)構(gòu)

數(shù)據(jù)存儲結(jié)構(gòu)

MongoDB默認(rèn)數(shù)據(jù)目錄為 /data/db外永,它負(fù)責(zé)存儲所有MongoDB的數(shù)據(jù)文件崎脉。

MongoDB在Windows中的數(shù)據(jù)存儲結(jié)構(gòu)

預(yù)分配空間

MongoDB內(nèi)部有預(yù)分配空間的機(jī)制,每個預(yù)分配的文件都用0填充伯顶,使MongoDB始終保持額外的空間和空余的數(shù)據(jù)文件囚灼,從而有效地避免了由于數(shù)據(jù)暴增而帶來的磁盤壓力過大的問題。

由于表中數(shù)據(jù)量增加祭衩,數(shù)據(jù)文件每次分配一次灶体,其大小都會是上一個數(shù)據(jù)文件大小的2倍 ,每個數(shù)據(jù)文件最大2G掐暮。預(yù)分配機(jī)制有利于防止較小的數(shù)據(jù)庫浪費過多的磁盤空間蝎抽,同時又保證較大的數(shù)據(jù)庫又響應(yīng)的預(yù)留空間使用。

表命名空間

數(shù)據(jù)庫的每張表都對應(yīng)一個命名空間路克,每個索引也有對應(yīng)的命名空間织中,這些命名空間的元數(shù)據(jù)都集中在 *.ns 文件中。

基本概念

文檔

每種編程語言表示文檔的方式不同衷戈,多個鍵及其關(guān)聯(lián)的值有序地對應(yīng)組織是文檔狭吼,例如映射、散列殖妇、字典等刁笙,在JS中對象即文檔。

  • 文檔的鍵值對是有序的
  • 文檔的值可使用任意UTF-8字符,其數(shù)據(jù)類型是多樣的疲吸。
  • 文檔不能存在重復(fù)的鍵

集合

集合即一組文檔座每,集合是無模式的,意味著集合中的文檔可以是各樣的摘悴。那么為什么要使用多個集合呢峭梳?

  • 在集合中查詢特定類型的文檔的速度
  • 同種類型的文檔放在一個集合中,數(shù)據(jù)更加集中蹂喻。
  • 創(chuàng)建索引時葱椭,文檔會附加結(jié)構(gòu)。索引是按集合來定義的口四,同種類型的文檔放在同一個集合中孵运,使得索引更加有效。

數(shù)據(jù)庫

多個集合組成數(shù)據(jù)庫蔓彩,一個數(shù)據(jù)庫實例可承載多個數(shù)據(jù)庫治笨,數(shù)據(jù)庫之間可視為完全獨立。
每個數(shù)據(jù)庫都有獨立的權(quán)限控制赤嚼,即便在磁盤上不同數(shù)據(jù)庫也放置在不同的文件中旷赖,數(shù)據(jù)庫最終變成文件系統(tǒng)里的文件。

shell

MongoDB自帶JS shell以便于從命名行與數(shù)據(jù)庫實例交互更卒,shell是一個獨立MongoDB客戶端杠愧。shell中的基礎(chǔ)操作CURD:創(chuàng)建、讀取逞壁、更新流济、刪除。

> post = {title:'ipost', content:'here is blog post', date:new Date()};
> db.blog.insert(post);
> db.blog.find();
> db.blog.findOne();

> post.comments = [];
> db.blog.update({title:'ipost'}, post);
> db.blog.find();

> db.blog.remove({title:'ipost'});
MongoDB

NoSQL

NoSQL(Not Only SQL)非關(guān)系型數(shù)據(jù)庫腌闯,其特點是非關(guān)系型绳瘟、分布式、開源姿骏、水平擴(kuò)展糖声。NoSQL使用最多的當(dāng)屬key-value存儲,當(dāng)前還有文檔型分瘦、列存儲蘸泻、圖形數(shù)據(jù)庫、XML數(shù)據(jù)庫等嘲玫。

Memcached和Redis是key-value型數(shù)據(jù)庫悦施,即通過key指向value并通過hash算法關(guān)聯(lián)以達(dá)到高效的查詢效率。MongoDB是文檔數(shù)據(jù)庫去团,存儲的是BSON(JSON的二進(jìn)制化)抡诞。其內(nèi)部執(zhí)行引擎為JS解釋器穷蛹,將文檔存儲為BSON結(jié)構(gòu),轉(zhuǎn)換為JS對象昼汗。

MongoDB與傳統(tǒng)型數(shù)據(jù)庫相比較肴熏,傳統(tǒng)型數(shù)據(jù)庫存儲的是結(jié)構(gòu)化數(shù)據(jù),定義好表結(jié)構(gòu)后每行數(shù)據(jù)必須符合列的個數(shù)和類型顷窒。

MongoDB沒有模式蛙吏,文檔的鍵不會事先定義也不會固定不變,由于沒有模式需要更改鞋吉,通常無需遷移大量數(shù)據(jù)鸦做。不必將所有數(shù)據(jù)都放到一個模子中,應(yīng)用層可處理新增或丟失的鍵坯辩,開發(fā)者可非常容易地變更數(shù)據(jù)庫模型。

安裝

http://www.mongodb.org
工具集

  • bsondum 導(dǎo)出后bson結(jié)構(gòu)
  • mongo 客戶端
  • mongod 服務(wù)端
  • mongodump 導(dǎo)入備份
  • mongorestore 數(shù)據(jù)恢復(fù)
  • mongos 路由器崩侠,分片時使用漆魔。

啟動服務(wù)端

mongos --help

mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017

參數(shù)

--dbpath 數(shù)據(jù)庫存放目錄,每個數(shù)據(jù)庫會在其中創(chuàng)建一個子目錄却音,用于防止同一個實例多次運行改抡,mongod.lock 也保存在次目錄下。
--logpath 數(shù)據(jù)庫日志存放目錄系瓢,錯誤日志文件
--port 服務(wù)端口默認(rèn)27017
--fork 以后臺進(jìn)程即Daemon方式啟動
--logappend 錯誤日志采用追加模式阿纤,默認(rèn)為覆寫模式。
--bind_ip 對外服務(wù)的綁定IP
# 查看磁盤空間
df -h

# 啟動數(shù)據(jù)庫
mongod --dbpath /home/mongo/database --dblog /home/mongo/db.log --fork=27017 --port 27017

# 查看服務(wù)進(jìn)程
ps -aux|grep mongo

配置文件方式啟動

# 讀取啟動配置文件的方式來啟動數(shù)據(jù)庫
cat /etc/mongodb.conf
dbpath = /data/db
# 寫入配置
mongod -f /etc/mongodb.conf

關(guān)閉數(shù)據(jù)庫

直接通過在admin庫中發(fā)送db.shutdownServer()來停止MongoDB實例夷陋。

db.shutdownServer()

也可殺死數(shù)據(jù)庫實例的進(jìn)程

ps aux | grep mongod
# 不用使用 kill -9 PID來殺死MongoDB會導(dǎo)致MongoDB的數(shù)據(jù)損壞欠拾。
kill -2 PID
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骗绕,隨后出現(xiàn)的幾起案子藐窄,更是在濱河造成了極大的恐慌,老刑警劉巖酬土,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荆忍,死亡現(xiàn)場離奇詭異,居然都是意外死亡撤缴,警方通過查閱死者的電腦和手機(jī)刹枉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈呕,“玉大人微宝,你說我怎么就攤上這事』⒄#” “怎么了芥吟?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵侦铜,是天一觀的道長。 經(jīng)常有香客問我钟鸵,道長钉稍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任棺耍,我火速辦了婚禮贡未,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒙袍。我一直安慰自己俊卤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布害幅。 她就那樣靜靜地躺著消恍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪以现。 梳的紋絲不亂的頭發(fā)上狠怨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音邑遏,去河邊找鬼佣赖。 笑死,一個胖子當(dāng)著我的面吹牛记盒,可吹牛的內(nèi)容都是我干的憎蛤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼纪吮,長吁一口氣:“原來是場噩夢啊……” “哼俩檬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碾盟,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤豆胸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巷疼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晚胡,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年嚼沿,在試婚紗的時候發(fā)現(xiàn)自己被綠了估盘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡骡尽,死狀恐怖遣妥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情攀细,我是刑警寧澤箫踩,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布爱态,位于F島的核電站,受9級特大地震影響境钟,放射性物質(zhì)發(fā)生泄漏锦担。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一慨削、第九天 我趴在偏房一處隱蔽的房頂上張望洞渔。 院中可真熱鬧,春花似錦缚态、人聲如沸磁椒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浆熔。三九已至,卻和暖如春桥帆,著一層夾襖步出監(jiān)牢的瞬間医增,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工环葵, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留调窍,地道東北人宝冕。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓张遭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親地梨。 傳聞我的和親對象是個殘疾皇子菊卷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350