下載地址 https://www.mongodb.com/download-center
MongoDB是CS架構(gòu)的,使用前需啟動(dòng)服務(wù)端。
啟動(dòng)服務(wù)端
-
mongod run
直接啟動(dòng) -
mongod --dbpath=DBPATH
指定特定數(shù)據(jù)存儲(chǔ)目錄啟動(dòng),若目錄不存在則創(chuàng)建。 -
mongod --logpath=LOGFILE
指定特定日志文件 -
mongod --dbport=DBPORT
指定特定端口啟動(dòng),默認(rèn)27017.
Wins中默認(rèn)數(shù)據(jù)存放目錄 C:\data\db
Linux中默認(rèn)數(shù)據(jù)存儲(chǔ)目錄 /data/db
啟動(dòng)服務(wù)端時(shí)指定存儲(chǔ)目錄并啟動(dòng)
- 將MongoDB作為Windows服務(wù)隨機(jī)啟動(dòng)
$ 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
先要?jiǎng)?chuàng)建對(duì)應(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ī)啟動(dòng)
# 創(chuàng)建mongodb日志文件
> touch /var/logs/mongodb.log
# mongodb隨機(jī)啟動(dòng)
> 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.
請(qǐng)求與連接
MongoDB數(shù)據(jù)庫會(huì)為每個(gè)連接創(chuàng)建一個(gè)隊(duì)列,存放該連接的請(qǐng)求。當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求會(huì)被放到隊(duì)列末尾。只有隊(duì)列中的請(qǐng)求都執(zhí)行完畢,后續(xù)的請(qǐng)求才會(huì)執(zhí)行。所以從單個(gè)連接就可以了解整個(gè)數(shù)據(jù)庫,并且它總是能讀到自己寫的東西。
每個(gè)隊(duì)列都有獨(dú)立的,打開兩個(gè)shell就有兩個(gè)數(shù)據(jù)庫連接。在一個(gè)shell中執(zhí)行插入之后在另一個(gè)查詢,不一定能得到插入的文檔。然而,在同一個(gè)shell中,插入后再進(jìn)行查詢是一定能查詢到的。在繁忙的服務(wù)器上,交錯(cuò)的插入或查詢顯得稀松平常。當(dāng)開發(fā)者用一個(gè)線程插入數(shù)據(jù),用另一個(gè)線程檢查是否成功插入時(shí),會(huì)經(jīng)常遇到這種問題。有那么一兩秒時(shí)間好像根本就沒插入數(shù)據(jù),但隨后數(shù)據(jù)又突然冒出來。
使用Ruby、Python、Java驅(qū)動(dòng)程序時(shí),要特別注意這種行為,因?yàn)檎Z言的驅(qū)動(dòng)都使用了連接池。為提高效率,驅(qū)動(dòng)程序和服務(wù)器建立了多個(gè)連接(連接池),并將請(qǐng)求分散到這些連接中,好在它們都提供了一些機(jī)制來確保一系列的請(qǐng)求都由一個(gè)連接來處理。
體系結(jié)構(gòu)
一個(gè)運(yùn)行著的MongoDB數(shù)據(jù)庫可看成是一個(gè)MongoDB Server,該Server由實(shí)例和數(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ù)存儲(chǔ)結(jié)構(gòu)
MongoDB默認(rèn)數(shù)據(jù)目錄為 /data/db
,它負(fù)責(zé)存儲(chǔ)所有MongoDB的數(shù)據(jù)文件。
預(yù)分配空間
MongoDB內(nèi)部有預(yù)分配空間的機(jī)制,每個(gè)預(yù)分配的文件都用0填充,使MongoDB始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效地避免了由于數(shù)據(jù)暴增而帶來的磁盤壓力過大的問題。
由于表中數(shù)據(jù)量增加,數(shù)據(jù)文件每次分配一次,其大小都會(huì)是上一個(gè)數(shù)據(jù)文件大小的2倍 ,每個(gè)數(shù)據(jù)文件最大2G。預(yù)分配機(jī)制有利于防止較小的數(shù)據(jù)庫浪費(fèi)過多的磁盤空間,同時(shí)又保證較大的數(shù)據(jù)庫又響應(yīng)的預(yù)留空間使用。
表命名空間
數(shù)據(jù)庫的每張表都對(duì)應(yīng)一個(gè)命名空間,每個(gè)索引也有對(duì)應(yīng)的命名空間,這些命名空間的元數(shù)據(jù)都集中在 *.ns
文件中。
基本概念
文檔
每種編程語言表示文檔的方式不同,多個(gè)鍵及其關(guān)聯(lián)的值有序地對(duì)應(yīng)組織是文檔,例如映射、散列、字典等,在JS中對(duì)象即文檔。
- 文檔的鍵值對(duì)是有序的
- 文檔的值可使用任意UTF-8字符,其數(shù)據(jù)類型是多樣的。
- 文檔不能存在重復(fù)的鍵
集合
集合即一組文檔,集合是無模式的,意味著集合中的文檔可以是各樣的。那么為什么要使用多個(gè)集合呢?
- 在集合中查詢特定類型的文檔的速度
- 同種類型的文檔放在一個(gè)集合中,數(shù)據(jù)更加集中。
- 創(chuàng)建索引時(shí),文檔會(huì)附加結(jié)構(gòu)。索引是按集合來定義的,同種類型的文檔放在同一個(gè)集合中,使得索引更加有效。
數(shù)據(jù)庫
多個(gè)集合組成數(shù)據(jù)庫,一個(gè)數(shù)據(jù)庫實(shí)例可承載多個(gè)數(shù)據(jù)庫,數(shù)據(jù)庫之間可視為完全獨(dú)立。
每個(gè)數(shù)據(jù)庫都有獨(dú)立的權(quán)限控制,即便在磁盤上不同數(shù)據(jù)庫也放置在不同的文件中,數(shù)據(jù)庫最終變成文件系統(tǒng)里的文件。
shell
MongoDB自帶JS shell以便于從命名行與數(shù)據(jù)庫實(shí)例交互,shell是一個(gè)獨(dú)立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ù)庫,其特點(diǎn)是非關(guān)系型、分布式、開源、水平擴(kuò)展。NoSQL使用最多的當(dāng)屬key-value存儲(chǔ),當(dāng)前還有文檔型、列存儲(chǔ)、圖形數(shù)據(jù)庫、XML數(shù)據(jù)庫等。
Memcached和Redis是key-value型數(shù)據(jù)庫,即通過key指向value并通過hash算法關(guān)聯(lián)以達(dá)到高效的查詢效率。MongoDB是文檔數(shù)據(jù)庫,存儲(chǔ)的是BSON(JSON的二進(jìn)制化)。其內(nèi)部執(zhí)行引擎為JS解釋器,將文檔存儲(chǔ)為BSON結(jié)構(gòu),轉(zhuǎn)換為JS對(duì)象。
MongoDB與傳統(tǒng)型數(shù)據(jù)庫相比較,傳統(tǒng)型數(shù)據(jù)庫存儲(chǔ)的是結(jié)構(gòu)化數(shù)據(jù),定義好表結(jié)構(gòu)后每行數(shù)據(jù)必須符合列的個(gè)數(shù)和類型。
MongoDB沒有模式,文檔的鍵不會(huì)事先定義也不會(huì)固定不變,由于沒有模式需要更改,通常無需遷移大量數(shù)據(jù)。不必將所有數(shù)據(jù)都放到一個(gè)模子中,應(yīng)用層可處理新增或丟失的鍵,開發(fā)者可非常容易地變更數(shù)據(jù)庫模型。
安裝
- bsondum 導(dǎo)出后bson結(jié)構(gòu)
- mongo 客戶端
- mongod 服務(wù)端
- mongodump 導(dǎo)入備份
- mongorestore 數(shù)據(jù)恢復(fù)
- mongos 路由器,分片時(shí)使用。
啟動(dòng)服務(wù)端
mongos --help
mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
參數(shù)
--dbpath 數(shù)據(jù)庫存放目錄,每個(gè)數(shù)據(jù)庫會(huì)在其中創(chuàng)建一個(gè)子目錄,用于防止同一個(gè)實(shí)例多次運(yùn)行,mongod.lock 也保存在次目錄下。
--logpath 數(shù)據(jù)庫日志存放目錄,錯(cuò)誤日志文件
--port 服務(wù)端口默認(rèn)27017
--fork 以后臺(tái)進(jìn)程即Daemon方式啟動(dòng)
--logappend 錯(cuò)誤日志采用追加模式,默認(rèn)為覆寫模式。
--bind_ip 對(duì)外服務(wù)的綁定IP
# 查看磁盤空間
df -h
# 啟動(dòng)數(shù)據(jù)庫
mongod --dbpath /home/mongo/database --dblog /home/mongo/db.log --fork=27017 --port 27017
# 查看服務(wù)進(jìn)程
ps -aux|grep mongo
配置文件方式啟動(dòng)
# 讀取啟動(dòng)配置文件的方式來啟動(dòng)數(shù)據(jù)庫
cat /etc/mongodb.conf
dbpath = /data/db
# 寫入配置
mongod -f /etc/mongodb.conf
關(guān)閉數(shù)據(jù)庫
直接通過在admin庫中發(fā)送db.shutdownServer()來停止MongoDB實(shí)例。
db.shutdownServer()
也可殺死數(shù)據(jù)庫實(shí)例的進(jìn)程
ps aux | grep mongod
# 不用使用 kill -9 PID來殺死MongoDB會(huì)導(dǎo)致MongoDB的數(shù)據(jù)損壞。
kill -2 PID