下載地址 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
組成,database
由 collections
組成译暂,collections
由documents
組成抠忘,而 documents
由 fields
組成。
數(shù)據(jù)存儲結(jié)構(gòu)
MongoDB默認(rèn)數(shù)據(jù)目錄為 /data/db
外永,它負(fù)責(zé)存儲所有MongoDB的數(shù)據(jù)文件崎脉。
預(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'});
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ù)庫模型。
安裝
- 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