注:本系列教程是自己學(xué)習(xí)的記錄惑折,內(nèi)容來(lái)至 菜鳥(niǎo)教程
MongoDB入門(mén)教程01
MongoDB入門(mén)教程02
MongoDB入門(mén)教程03
MongoDB入門(mén)教程04
MongoDB入門(mén)教程05
1. MongoDB概念解析
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 | aggregate | 聚合實(shí)現(xiàn)(look up) |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
2. 安裝配置(v3.6)
MAC版使用brew 安裝:brew install mongodb
啟動(dòng):brew services start mongodb
停止:brew services stop mongodb
重啟:brew services restart mongodb
配置文件:/usr/local/etc/mongod.conf
配置文件格式采用yaml的方式如蚜,參考
systemLog:
destination: file
path: /usr/local/var/log/mongodb/mongo.log
logAppend: true
storage:
dbPath: /usr/local/var/mongodb
net:
# bindIp: 127.0.0.1 # 只能通過(guò)localhost(127.0.0.1)來(lái)訪問(wèn),配置成 0.0.0.0态秧,所有可用的IP4可訪問(wèn)
bindIpAll: true # 所有IP4 IP6 均可訪問(wèn)
3. 數(shù)據(jù)庫(kù)(DataBase)
啟動(dòng)時(shí)出現(xiàn)權(quán)限警告炼鞠,請(qǐng)參考官網(wǎng)文檔:MongoDB Security Part II: 10 mistakes that can compromise your database
$ mongo
MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.4
...
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
runoob 0.000GB
> use runoob
switched to db runoob
admin: 從權(quán)限的角度來(lái)看捂敌,這是"root"數(shù)據(jù)庫(kù)。要是將一個(gè)用戶添加到這個(gè)數(shù)據(jù)庫(kù)艰毒,這個(gè)用戶自動(dòng)繼承所有數(shù)據(jù)庫(kù)的權(quán)限筐高。一些特定的服務(wù)器端命令也只能從這個(gè)數(shù)據(jù)庫(kù)運(yùn)行,比如列出所有的數(shù)據(jù)庫(kù)或者關(guān)閉服務(wù)器
local: 這個(gè)數(shù)據(jù)永遠(yuǎn)不會(huì)被復(fù)制丑瞧,可以用來(lái)存儲(chǔ)限于本地單臺(tái)服務(wù)器的任意集合
config: 當(dāng)Mongo用于分片設(shè)置時(shí)柑土,config數(shù)據(jù)庫(kù)在內(nèi)部使用,用于保存分片的相關(guān)信息
4. 文檔(Document)
文檔是一組鍵值(key-value)對(duì)(即BSON绊汹,Binary JSON)稽屏。MongoDB 的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型西乖,這與關(guān)系型數(shù)據(jù)庫(kù)有很大的區(qū)別狐榔,也是 MongoDB 非常突出的特點(diǎn)。
例子如下:
{"site":"www.google.com", "slogan":"Don't be evil"}
注意:
文檔中的鍵/值對(duì)是有序的获雕。
文檔中的值不僅可以是在雙引號(hào)里面的字符串薄腻,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個(gè)嵌入的文檔)。
MongoDB區(qū)分類型和大小寫(xiě)典鸡。
MongoDB的文檔不能有重復(fù)的鍵被廓。
文檔的鍵是字符串。除了少數(shù)例外情況萝玷,鍵可以使用任意UTF-8字符嫁乘。
5. 集合(Collection)
集合存在于數(shù)據(jù)庫(kù)中,集合沒(méi)有固定的結(jié)構(gòu)球碉,這意味著你在對(duì)集合可以插入不同格式和類型的數(shù)據(jù)蜓斧,但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性。
{"site":"www.baidu.com"}
{"site":"www.google.com","slogan":"Don't be evil"}
{"site":"www.reibang.com","name":"簡(jiǎn)書(shū)", "description": "最佳寫(xiě)作網(wǎng)站"}
當(dāng)?shù)谝粋€(gè)文檔插入時(shí)睁冬,集合就會(huì)被創(chuàng)建挎春。
6. capped collections
Capped collections 是固定大小的 collection看疙,是高性能自動(dòng)維護(hù)對(duì)象插入的順序。它非常適合類似記錄日志的功能和標(biāo)準(zhǔn)的collection不同直奋,你必須要顯式的創(chuàng)建一個(gè)capped collection能庆, 指定一個(gè)collection的大小,單位是字節(jié)脚线。collection的數(shù)據(jù)存儲(chǔ)空間值提前分配的搁胆。當(dāng)集合大小達(dá)到最大值時(shí),最早插入的數(shù)據(jù)會(huì)被覆蓋掉
> db.createCollection("capcoll", {capped:true, size: 100000})
在capped collection中邮绿,你能添加新的對(duì)象渠旁。
能進(jìn)行更新,然而船逮,對(duì)象不會(huì)增加存儲(chǔ)空間顾腊。如果增加,更新就會(huì)失敗 挖胃。
數(shù)據(jù)庫(kù)不允許進(jìn)行刪除杂靶。可使用drop()方法刪除collection所有的行冠骄。注意: 刪除之后伪煤,你必須顯式的重新創(chuàng)建這個(gè)collection。
在32bit機(jī)器中凛辣,capped collection最大存儲(chǔ)為1e9( 1X109)個(gè)字節(jié)抱既。
7. 元數(shù)據(jù)
數(shù)據(jù)庫(kù)的信息是存儲(chǔ)在集合中,它們使用了系統(tǒng)的命名空間:
> dbname.system.*
在MongoDB數(shù)據(jù)庫(kù)中名字空間 <dbname>.system.* 是包含多種系統(tǒng)信息的特殊集合(Collection)扁誓,如下:
集合命名空間 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空間防泵。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含數(shù)據(jù)庫(kù)概要(profile)信息蝗敢。 |
dbname.system.users | 列出所有可訪問(wèn)數(shù)據(jù)庫(kù)的用戶捷泞。 |
dbname.local.sources | 包含復(fù)制對(duì)端(slave)的服務(wù)器信息和狀態(tài)。 |
對(duì)于修改系統(tǒng)集合中的對(duì)象有如下限制寿谴。
在{{system.indexes}}
插入數(shù)據(jù)锁右,可以創(chuàng)建索引。但除此之外該表信息是不可變的(特殊的drop index
命令將自動(dòng)更新相關(guān)信息)讶泰。
{{system.users}}
是可修改的咏瑟,{{system.profile}}
是可刪除的
8. 數(shù)據(jù)類型
數(shù)據(jù)類型 | 描述 |
---|---|
String | 字符串。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型痪署。在 MongoDB 中码泞,UTF-8 編碼的字符串才是合法的。 |
Integer | 整型數(shù)值狼犯。用于存儲(chǔ)數(shù)值余寥。根據(jù)你所采用的服務(wù)器领铐,可分為 32 位或 64 位。 |
Boolean | 布爾值宋舷。用于存儲(chǔ)布爾值(真/假)绪撵。 |
Double | 雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值祝蝠。 |
Min/Max keys | 將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對(duì)比莲兢。 |
Array | 用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵。 |
Timestamp | 時(shí)間戳续膳。記錄文檔修改或添加的具體時(shí)間。 |
Object | 用于內(nèi)嵌文檔收班。 |
Null | 用于創(chuàng)建空值坟岔。 |
Symbol | 符號(hào)。該數(shù)據(jù)類型基本上等同于字符串類型摔桦,但不同的是社付,它一般用于采用特殊符號(hào)類型的語(yǔ)言。 |
Date | 日期時(shí)間邻耕。用 UNIX 時(shí)間格式來(lái)存儲(chǔ)當(dāng)前日期或時(shí)間鸥咖。你可以指定自己的日期時(shí)間:創(chuàng)建 Date 對(duì)象,傳入年月日信息兄世。 |
Object ID | 對(duì)象 ID啼辣。用于創(chuàng)建文檔的 ID。 |
Binary Data | 二進(jìn)制數(shù)據(jù)御滩。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)鸥拧。 |
Code | 代碼類型。用于在文檔中存儲(chǔ) JavaScript 代碼削解。 |
Regular expression | 正則表達(dá)式類型富弦。用于存儲(chǔ)正則表達(dá)式。 |
9. ObjectId
ObjectId 類似唯一主鍵氛驮,可以很快的去生成和排序腕柜,包含 12 bytes,含義是:
前 4 個(gè)字節(jié)表示創(chuàng)建 unix時(shí)間戳,格林尼治時(shí)間 UTC 時(shí)間矫废,比北京時(shí)間晚了 8 個(gè)小時(shí)
接下來(lái)的 3 個(gè)字節(jié)是機(jī)器標(biāo)識(shí)碼
緊接的兩個(gè)字節(jié)由進(jìn)程 id 組成 PID
最后三個(gè)字節(jié)是隨機(jī)數(shù)
MongoDB 中存儲(chǔ)的文檔必須有一個(gè) _id 鍵盏缤。這個(gè)鍵的值可以是任何類型的,默認(rèn)是個(gè) ObjectId 對(duì)象
由于 ObjectId 中保存了創(chuàng)建的時(shí)間戳磷脯,所以你不需要為你的文檔保存時(shí)間戳字段蛾找,你可以通過(guò) getTimestamp 函數(shù)來(lái)獲取文檔的創(chuàng)建時(shí)間:
> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2018-10-31T02:20:43Z")
// ObjectId 轉(zhuǎn)為字符串
> newObject.str
5bd9117bfd76390be3425d11
10. 字符串
BSON 字符串都是 UTF-8 編碼。
11. 時(shí)間戳
BSON 有一個(gè)特殊的時(shí)間戳類型用于 MongoDB 內(nèi)部使用赵誓,與普通的 日期 類型不相關(guān)打毛。 時(shí)間戳值是一個(gè) 64 位的值柿赊。其中:
前32位是一個(gè) time_t 值(與Unix新紀(jì)元相差的秒數(shù))
后32位是在某秒中操作的一個(gè)遞增的序數(shù)
在單個(gè) mongod 實(shí)例中,時(shí)間戳值通常是唯一的幻枉。
在復(fù)制集中碰声, oplog 有一個(gè) ts 字段。這個(gè)字段中的值使用BSON時(shí)間戳表示了操作時(shí)間熬甫。
BSON 時(shí)間戳類型主要用于 MongoDB 內(nèi)部使用胰挑。在大多數(shù)情況下的應(yīng)用開(kāi)發(fā)中,你可以使用 BSON 日期類型椿肩。
12. 日期
表示當(dāng)前距離 Unix新紀(jì)元(1970年1月1日)的毫秒數(shù)瞻颂。日期類型是有符號(hào)的, 負(fù)數(shù)表示 1970 年之前的日期。
> var mydate1 = new Date() //格林尼治時(shí)間
> mydate1
ISODate("2018-03-04T14:58:51.233Z")
> typeof mydate1
object
?
> var mydate2 = ISODate() //格林尼治時(shí)間
> mydate2
ISODate("2018-03-04T15:00:45.479Z")
> typeof mydate2
object