MongoDB是面向文檔的數(shù)據(jù)庫(kù),而非關(guān)系型數(shù)據(jù)庫(kù)。它擴(kuò)展了關(guān)系型數(shù)據(jù)庫(kù)的眾多有用功能,如輔助查詢、范圍查詢和排序。
創(chuàng)新互聯(lián)專注于墨江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供墨江營(yíng)銷型網(wǎng)站建設(shè),墨江網(wǎng)站制作、墨江網(wǎng)頁(yè)設(shè)計(jì)、墨江網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造墨江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供墨江網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
它將原來(lái)的行的概念換成更加靈活的文檔模型。它沒(méi)有模式:文檔的鍵不會(huì)事先定義也不會(huì)固定不變。
MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value
)對(duì)組成。MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
有些關(guān)系型數(shù)據(jù)庫(kù)的常見(jiàn)功能MongoDB并不具備,比如聯(lián)接(join)和復(fù)雜的多行事務(wù)。
MongoDB 的擴(kuò)展性強(qiáng),其采用的面向文檔的數(shù)據(jù)模型使其可以自動(dòng)在多臺(tái)服務(wù)器之間分割數(shù)據(jù)。
MongoDB性能優(yōu)越。它將內(nèi)存管理工作交由操作系統(tǒng)處理;它利用查詢優(yōu)化器記住執(zhí)行查詢最高效的方式;它利用預(yù)分配數(shù)據(jù)文件的方式(用空間)換取性能的穩(wěn)定。
MongoDB的管理理念就是盡可能的讓服務(wù)器自動(dòng)配置,簡(jiǎn)化數(shù)據(jù)庫(kù)的管理。比如如果主服務(wù)器掛掉,它會(huì)自動(dòng)切換到備份服務(wù)器上,并且將備份服務(wù)器提升為活躍服務(wù)器。
NOSQL簡(jiǎn)介
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。但事實(shí)上很多NoSql數(shù)據(jù)庫(kù)都放棄了對(duì) SQL語(yǔ)言的支持。
安裝方法見(jiàn):
開啟mongod:
sudo service mongod start
進(jìn)入mongo shell:
mongo
列出數(shù)據(jù)庫(kù):
show dbs
顯示當(dāng)前數(shù)據(jù)庫(kù)對(duì)象:
db
默認(rèn)是 test 。
切換數(shù)據(jù)庫(kù):
use
停止 mongod:
sudo service mongod stop
或者使用下面更加穩(wěn)妥的方式停止MongoDB:
# 切換到admin數(shù)據(jù)庫(kù)(讓自己具有管理員權(quán)限)
use admin
db.shutdownServer()
剛安裝的mongodb并沒(méi)有開啟用戶權(quán)限驗(yàn)證;所以連接時(shí)不需要認(rèn)證。
在mongodb中基本的概念是文檔、集合、數(shù)據(jù)庫(kù)。
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 | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
文檔類似于關(guān)系數(shù)據(jù)庫(kù)中的行。多個(gè)鍵及其關(guān)聯(lián)的值有序的放置在一起便是文檔。在JS中,文檔表示為對(duì)象。
每個(gè)文檔都有一個(gè)特殊的鍵_id
,它在文檔所處的集合中是唯一的。
幾個(gè)重要的概念:
文檔中的鍵/值對(duì)是有序的。
文檔的鍵是字符串。一般情況鍵可以使用UTF-8字符。
\0
空字符。它是用來(lái)表示鍵的結(jié)尾。.
和$
只有在特定環(huán)境才能使用_
開頭的鍵是保留的MongoDB不但區(qū)分類型,也區(qū)分大小寫。下面是兩組不同的文檔:
{"foo":3}
{"foo":"3"}
{"foo":3}
{"Foo":3}
?
集合可以被看作沒(méi)有模式的表。
子集合:
組織集合的一種慣例是使用 .
字符分開的命名空間劃分的子集合。比如:
blog.post和blog.authors,這樣做只是了使組織結(jié)構(gòu)更好些,也就是說(shuō)blog這個(gè)集合(這里根本就不需要存在)及其子集合沒(méi)有任何關(guān)系。
一個(gè)MongoDB實(shí)例可以承載多個(gè)數(shù)據(jù)庫(kù)。不同的數(shù)據(jù)庫(kù)存放在不同的文件中
要記住數(shù)據(jù)庫(kù)名最終會(huì)變成文件系統(tǒng)里的文件,所以數(shù)據(jù)庫(kù)名必須遵守一些約定。
保留的特殊數(shù)據(jù)庫(kù):
命名空間:把數(shù)據(jù)庫(kù)的名字放到集合名前面,得到的集合的完全限定名稱。
MongoDB的文檔類似于JSON,在概念上和JavaScript中的對(duì)象神似。MongoDB在保留JSON基本的鍵/值對(duì)特性的基礎(chǔ)上,添加了其它一些數(shù)據(jù)類型。在不同的編程語(yǔ)言下這些類型表示有些許差異。
null:
布爾:
32位整數(shù):
64位整數(shù):
64位浮點(diǎn)數(shù):
字符串
符號(hào)
對(duì)象id:ObjectId()。(文檔必須有一個(gè)"_id"鍵;這個(gè)鍵的值可以是任意類型,默認(rèn)是ObjectId對(duì)象。)
日期: new Date()
正則表達(dá)式:采用JavaScript的正則表達(dá)式語(yǔ)法
代碼: 文檔中還可以包含JavaScript代碼
{"x" : function(){/* */}}
二進(jìn)制數(shù)據(jù):
最大值
最小值
undefined
數(shù)組:值的集合或者列表可以表示成數(shù)組
{"x" : ["a","b","c"]}
{"x" : {"foo" : "bar"}}
默認(rèn)數(shù)據(jù)目錄 /data/db
,并使用27017端口。它還會(huì)啟動(dòng)一個(gè)非?;镜膆ttp服務(wù)器,監(jiān)聽數(shù)字比主端口號(hào)高 1000 的端口,比如 28017 端口。
MongoDB自帶一個(gè) JavaScript shell,可以從命令行與MongoDB實(shí)例交互。它也是一個(gè)完備的JS解釋器,可以運(yùn)行任何JS程序。
開啟的時(shí)候,shell會(huì)連接到MongoDB服務(wù)器的 test 數(shù)據(jù)庫(kù),并將這個(gè)數(shù)據(jù)庫(kù)連接賦值給全局變量 db。這個(gè)變量是通過(guò) shell 訪問(wèn) MongoDB的主要入口點(diǎn)。
shell還提供了一些語(yǔ)法糖,比如選擇數(shù)據(jù)庫(kù)的 usr dbName
,執(zhí)行該操作后 db 變量的值也會(huì)發(fā)生改變。
# 運(yùn)行 mongo 啟動(dòng) shell
mongo
# 列出數(shù)據(jù)庫(kù)
show dbs
# 切換數(shù)據(jù)庫(kù),如果該數(shù)據(jù)庫(kù)不存在則創(chuàng)建該數(shù)據(jù)庫(kù)
use imooc
# 刪除數(shù)據(jù)庫(kù)
db.dropDatabase()
對(duì)目標(biāo)集使用insert方法,插入一個(gè)文檔:
db.foo.insert({"bar":"baz"})
該操作會(huì)自動(dòng)增加一個(gè) "_id" 鍵(要是原來(lái)沒(méi)有)再保存到數(shù)據(jù)庫(kù)
批量插入:
批量插入能傳遞一個(gè)由文檔構(gòu)成的數(shù)組給數(shù)據(jù)庫(kù)。
插入數(shù)據(jù)時(shí):數(shù)據(jù)庫(kù)只會(huì)驗(yàn)證是否包含"_id"鍵,然后就簡(jiǎn)單的將文檔原樣的存入數(shù)據(jù)庫(kù)。
MongoDB在插入時(shí)并不執(zhí)行代碼,所以這塊沒(méi)有注入式***的可能。
刪除users集合中的所有文檔,但不刪除集合本身:
db.users.remove()
remove函數(shù)可以接受一個(gè)查詢文檔作為可選參數(shù)。這樣只有符合條件的文檔才能被刪除。
示例:所有"optout"為true的將被刪除:
db.mailing.list.remove({"opt-out" : true})
直接刪除集合:
db.drop_collection("bar")
使用update方法。該方法由兩個(gè)參數(shù),一個(gè)是查詢文檔,用來(lái)找出要更新的文檔;另一個(gè)是修改器(modifier)文檔,描述對(duì)找到的文檔做哪些更改。
更新操作是原子的:若是兩個(gè)更新同時(shí)發(fā)生,先到達(dá)服務(wù)器的先執(zhí)行,接著執(zhí)行另外一個(gè)。
更新修改器:是一種特殊的鍵,用來(lái)指定復(fù)雜的更新操作。
"$set"
修改器"$set"
修改器用來(lái)指定一個(gè)鍵的值。如果這個(gè)鍵不存在,則創(chuàng)建它。
示例:添加喜歡的書籍到某用戶信息
db.users.update(
{"_id":ObjectId("4fksdftudkf4964trub")}, //查詢文檔
{"$set":{"favorite book" : "war and peace"}} //修改器文檔
)
對(duì)應(yīng)的可以使用 "$unset"
將鍵完全刪除。
"$inc"
修改器"$inc"
修改器:用來(lái)增加已有的值,如果鍵不存在則創(chuàng)建一個(gè)鍵。
它只能用于整數(shù)、長(zhǎng)整數(shù)活浮點(diǎn)數(shù)。
db.games.update({"game":"pinball","user":"joe"}, //查詢文檔
{"$inc":{"score":50}}) //修改器文檔
上面示例:滿足條件的玩家加50分,如果分?jǐn)?shù)鍵(score)不存在則先創(chuàng)建該鍵。這里增量為50。
"$push"
修改器用于數(shù)組。"$push"
修改器會(huì)向已有的數(shù)組末尾加入一個(gè)元素,若是該鍵不存在則會(huì)創(chuàng)建一個(gè)新的數(shù)組。
注意:這里是指集合中的某個(gè)鍵的值為數(shù)組,現(xiàn)在要向這個(gè)數(shù)組中添加元素。
比如 blog.post集合如下:
{
id : ObjectId("4dkfs53rt9rufhvjr0fv"),
title : "A blog post",
content : "...",
comments : [
{
name : "joe",
email : "joe@gmail.com",
content : "nice post"
}
]
}
當(dāng)我們想向comments這個(gè)數(shù)組中添加一個(gè)元素,就可以使用 $push
。
使用 find 或者 findOne 函數(shù)和查詢文檔對(duì)數(shù)據(jù)庫(kù)執(zhí)行查詢。
查詢簡(jiǎn)單的類型,只要指定想要查找的值就好了。示例,查找所有"age"的值為27的文檔:
db.users.find({"age":27})
查詢條件:
相關(guān)操作符 | 描述 |
---|---|
$lt |
< |
$lte |
<= |
$gt |
> |
$gte |
>= |
$ne |
不等于 |
$in |
用來(lái)查詢一個(gè)鍵的多個(gè)值 |
$nin |
返回與數(shù)組中所有條件都不匹配的文檔 |
$or |
用來(lái)完成多個(gè)鍵值的任意給定值 |
$not |
是元語(yǔ)句,可以用在任何其他條件之上 |
查詢?cè)?18 ~ 30歲的用戶:
db.users.find({"age": {"$gte": 18, "$lte": 30} })
使用$in
對(duì)單個(gè)鍵做OR查詢
db.raffle.find({"ticket_no" : {"$in" : [725,542,390]}})
使用$or
可以對(duì)多個(gè)鍵做OR查詢。示例,找到 ticket_no 為 725或者winner為true的文檔:
db.raffle.find({"$or" : [{"ticket_no" : 725}, {"winner", true}]})
例如:數(shù)組是一個(gè)水果清單
db.food.insert({"fruit" : ["apple","banana","peach"]})
下面的查詢會(huì)匹配該文檔:
db.food.find({"fruit","banana"})
$all
:通過(guò)多個(gè)元素來(lái)匹配數(shù)組。
找到既有 apple 又有 banana 的文檔:
db.food.find({fruit: {$all : ["apple","banana"]}})
$size
用于查詢指定長(zhǎng)度的數(shù)組。
db.food.find({fruit: {$size : 3}})
如果允許通常只針對(duì)內(nèi)嵌文檔的特定鍵值進(jìn)行查詢才是比較好的做法,這樣即便數(shù)據(jù)模式改變,也不會(huì)有太大問(wèn)題。
我們可以使用"點(diǎn)表示法"查詢內(nèi)嵌的鍵:
db.people.find({"name.first" : "Joe", "name.last" : "Schome"})
"$where"
查詢"$where"
子句可以執(zhí)行任意JavaScipt作為查詢的一部分。由了它的補(bǔ)充,使得查詢能做任何事情。
最典型的應(yīng)用就算比較文檔中的兩個(gè)鍵的值是否相等。
db.foo.find({"$where" : "function(){return this.x + this.y == 10; }" })
注意:"$where"
查詢?cè)谒俣壬弦绕渌R?guī)查詢慢很多。
數(shù)據(jù)庫(kù)使用 游標(biāo) 來(lái)返回find的執(zhí)行結(jié)果。find返回的對(duì)象就是一個(gè)游標(biāo)。
游標(biāo)的方法:
幾乎所有的游標(biāo)的方法返回值也是游標(biāo),這樣就可以組成方法鏈。
直接執(zhí)行 mongod
,即可簡(jiǎn)單的啟動(dòng)服務(wù)器。該命令還有很多可配置的啟動(dòng)選項(xiàng):
選項(xiàng) | 描述 |
---|---|
--help | 查看所有選項(xiàng) |
--dbpath | 指定數(shù)據(jù)目錄。默認(rèn)值是/data/db |
--port | 指定服務(wù)器監(jiān)聽的端口號(hào) |
--fork | 以守護(hù)進(jìn)程的方式運(yùn)行MongoDB,創(chuàng)建服務(wù)器進(jìn)程 |
--logpath | 指定日志輸出路徑,而不是輸出到命令行 |
--config | 指定配置文件。配置文件中 # 是注釋符號(hào);語(yǔ)法形式是"選項(xiàng)-值"的形似。 |
每個(gè)mongod進(jìn)程都需要獨(dú)立的數(shù)據(jù)目錄。當(dāng)mongod啟動(dòng)時(shí),會(huì)在數(shù)據(jù)目錄中創(chuàng)建mongod.lock文件,該文件用于防止其他mongod進(jìn)程使用該數(shù)據(jù)目錄。并且要給它們指定不同的端口號(hào)。
這里只介紹一個(gè)穩(wěn)妥的停止數(shù)據(jù)庫(kù)的方法:使用shutdown命令,{"shutdown" : 1}
,這是管理命令,要在 admin 數(shù)據(jù)庫(kù)下使用。 MongoDB shell提供了輔助函數(shù),來(lái)簡(jiǎn)化這一過(guò)程:
> use admin
switched to db admin
> db.shutdownServer();
server should be down...
《MongoDB權(quán)威指南》
MongoDB 教程 - 菜鳥教程
官方手冊(cè):The MongoDB Manual
MongoDB中文社區(qū)
MongoDB中文網(wǎng)
Mongodb最佳實(shí)踐-麥子學(xué)院
MongoDB基礎(chǔ)教程-慕課網(wǎng)課程
圖形工具: Robo 3T - formerly Robomongo — native MongoDB management tool (Admin UI)
來(lái)自于我的簡(jiǎn)書:faner - 簡(jiǎn)書