MongoDB Base

下載地址 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 組成,databasecollections 組成,collectionsdocuments 組成,而 documentsfields 組成。

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

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

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

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

預(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'});
MongoDB

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ù)庫模型。

安裝

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

  • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。