- MongoDB 是一個(gè)基于分布式 文件存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù)
- 由C++語(yǔ)言編寫爬舰,運(yùn)行穩(wěn)定身弊,性能高
- 旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案
- 查看官方網(wǎng)站
MongoDB特點(diǎn)
- 模式自由 :可以把不同結(jié)構(gòu)的文檔存儲(chǔ)在同一個(gè)數(shù)據(jù)庫(kù)里
- 面向集合的存儲(chǔ):適合存儲(chǔ) JSON風(fēng)格文件的形式
- 完整的索引支持:對(duì)任何屬性可索引
- 復(fù)制和高可用性:支持服務(wù)器之間的數(shù)據(jù)復(fù)制伐谈,支持主-從模式及服務(wù)器之間的相互復(fù)制寡痰。復(fù)制的主要目的是提供冗余及自動(dòng)故障轉(zhuǎn)移
- 自動(dòng)分片:支持云級(jí)別的伸縮性:自動(dòng)分片功能支持水平的數(shù)據(jù)庫(kù)集群,可動(dòng)態(tài)添加額外的機(jī)器
- 豐富的查詢:支持豐富的查詢表達(dá)方式糙捺,查詢指令使用JSON形式的標(biāo)記伐割,可輕易查詢文檔中的內(nèi)嵌的對(duì)象及數(shù)組
- 快速就地更新:查詢優(yōu)化器會(huì)分析查詢表達(dá)式候味,并生成一個(gè)高效的查詢計(jì)劃
- 高效的傳統(tǒng)存儲(chǔ)方式:支持二進(jìn)制數(shù)據(jù)及大型對(duì)象(如照片或圖片)
基本操作
- MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔刃唤,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成
- MongoDB文檔類似于JSON對(duì)象,字段值可以包含其他文檔白群、數(shù)組尚胞、文檔數(shù)組
- 安裝管理mongodb環(huán)境
- 完成數(shù)據(jù)庫(kù)、集合的管理
- 數(shù)據(jù)的增加川抡、修改辐真、刪除、查詢
名詞
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 | 索引 |
tablejoins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
- 三元素:數(shù)據(jù)庫(kù),集合,文檔
- 集合就是關(guān)系數(shù)據(jù)庫(kù)中的表
- 文檔對(duì)應(yīng)著關(guān)系數(shù)據(jù)庫(kù)中的行
- 文檔弛饭,就是一個(gè)對(duì)象,由鍵值對(duì)構(gòu)成楔脯,是json的擴(kuò)展Bson形式
{'name':'guojing','gender':'男'}
- 集合:類似于關(guān)系數(shù)據(jù)庫(kù)中的表,儲(chǔ)存多個(gè)文檔胯甩,結(jié)構(gòu)不固定昧廷,如可以存儲(chǔ)如下文檔在一個(gè)集合中
{'name':'guojing','gender':'男'}
{'name':'huangrong','age':18}
{'book':'shuihuzhuan','heros':'108'}
- 數(shù)據(jù)庫(kù):是一個(gè)集合的物理容器,一個(gè)數(shù)據(jù)庫(kù)中可以包含多個(gè)文檔
- 一個(gè)服務(wù)器通常有多個(gè)數(shù)據(jù)庫(kù)
1.啟動(dòng)服務(wù)器
在終端敲:mongod來(lái)啟動(dòng)MongoDB服務(wù)器
2.啟動(dòng)客戶端
在終端敲:mongo來(lái)啟動(dòng)MongoDB客戶器
3.數(shù)據(jù)庫(kù)切換
- 查看當(dāng)前數(shù)據(jù)庫(kù)名稱
db
- 查看所有數(shù)據(jù)庫(kù)名稱,列出所有在物理上存在的數(shù)據(jù)庫(kù)
show dbs
- 切換數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)不存在偎箫,則指向數(shù)據(jù)庫(kù)木柬,但不創(chuàng)建,直到插入數(shù)據(jù)或創(chuàng)建集合時(shí)數(shù)據(jù)庫(kù)才被創(chuàng)建
use 數(shù)據(jù)庫(kù)名稱
- 默認(rèn)的數(shù)據(jù)庫(kù)為test淹办,如果你沒(méi)有創(chuàng)建新的數(shù)據(jù)庫(kù)眉枕,集合將存放在test數(shù)據(jù)庫(kù)中
4. 數(shù)據(jù)庫(kù)刪除
- 刪除==當(dāng)前指向的數(shù)據(jù)==庫(kù),如果數(shù)據(jù)庫(kù)不存在,則什么也不做
db.dropDatabase()
5.集合創(chuàng)建
- 語(yǔ)法
name是要?jiǎng)?chuàng)建的集合的名稱,options是一個(gè)文檔怜森,用于指定集合的配置
選項(xiàng)??參數(shù)是可選的速挑,所以只需要到指定的集合名稱。以下是可以使用的選項(xiàng)列表
例1:不限制集合大小
db.createCollection("stu")
例2:限制集合大小副硅,后面學(xué)會(huì)插入語(yǔ)句后可以查看效果
參數(shù)capped:默認(rèn)值為false表示不設(shè)置上限姥宝,值為true表示設(shè)置上限
參數(shù)size:當(dāng)capped值為true時(shí),需要指定此參數(shù)恐疲,表示上限大小腊满,當(dāng)文檔達(dá)到上限時(shí),會(huì)將之前的數(shù)據(jù)覆蓋培己,單位為字節(jié)
db.createCollection("sub", { capped : true, size : 10 } )
6.查看當(dāng)前數(shù)據(jù)庫(kù)的集合
- 語(yǔ)法
show collections
7. 刪除
db.集合名稱.drop()
8 數(shù)據(jù)類型
- 下表為MongoDB中常用的幾種數(shù)據(jù)類型:
- Object ID:文檔ID
- String:字符串糜烹,最常用,必須是有效的UTF-8
- Boolean:存儲(chǔ)一個(gè)布爾值漱凝,true或false
- Integer:整數(shù)可以是32位或64位,這取決于服務(wù)器
- Double:存儲(chǔ)浮點(diǎn)值
- Arrays:數(shù)組或列表诸迟,多個(gè)值存儲(chǔ)到一個(gè)鍵
- Object:用于嵌入式的文檔茸炒,即一個(gè)值為一個(gè)文檔
- Null:存儲(chǔ)Null值
- Timestamp:時(shí)間戳
- Date:存儲(chǔ)當(dāng)前日期或時(shí)間的UNIX時(shí)間格式
- object id
每個(gè)文檔都有一個(gè)屬性愕乎,為_id,保證每個(gè)文檔的唯一性壁公,可以自己去設(shè)置_id插入文檔感论,如果沒(méi)有提供,那么MongoDB為每個(gè)文檔提供了一個(gè)獨(dú)特的_id紊册,類型為objectID比肄,objectID是一個(gè)12字節(jié)的十六進(jìn)制數(shù),前4個(gè)字節(jié)為當(dāng)前時(shí)間戳囊陡,接下來(lái)3個(gè)字節(jié)的機(jī)器ID芳绩,接下來(lái)的2個(gè)字節(jié)中MongoDB的服務(wù)進(jìn)程id,最后3個(gè)字節(jié)是簡(jiǎn)單的增量值
插入
插入文檔時(shí)撞反,如果不指定_id參數(shù)妥色,MongoDB會(huì)為文檔分配一個(gè)唯一的ObjectId
db.集合名稱.insert(document)
db.stu.insert({name:'gj',gender:1})
查詢
db.集合名稱.find()
db.mystu.find()
更新
參數(shù)query:查詢條件,類似sql語(yǔ)句update中where部分
參數(shù)update:更新操作符遏片,類似sql語(yǔ)句update中set部分
參數(shù)multi:可選嘹害,默認(rèn)是false,表示只更新找到的第一條記錄吮便,值為true表示把滿足條件的文檔全部更新
db.集合名稱.update(
<query>,
<update>,
{multi: <boolean>}
)
全屬性更新
db.mystu.update({'name':'fangyukui'},{name:'yu-vin',gender:25})
指定屬性更新笔呀,通過(guò)操作符$set
db.mystu.update({'name':'yu-vin'},{$set:{gender:24}})
修改多條匹配到的數(shù)據(jù)
b.mystu.update({},{$set:{gender:0}},{multi:true})
保存
如果文檔的_id已經(jīng)存在則修改,如果文檔的_id不存在則添加
db.集合名稱.save(document)
db.stu.save({_id:'1','name':'yk',gender:1})
db.stu.save({_id:'1','name':'yu',gender:1})
刪除
參數(shù)query:可選髓需,刪除的文檔的條件
參數(shù)justOne:可選许师,如果設(shè)為true或1,則只刪除一條授账,默認(rèn)false枯跑,表示刪除多條
db.集合名稱.remove(
<query>,
{
justOne: <boolean>
}
)
db.mystu.remove({gender:0},{justOne:true})
全部刪除
db.mystu.remove({})
數(shù)據(jù)查詢
方法find():查詢
db.集合名稱.find({條件文檔})
方法findOne():查詢,只返回第一個(gè)
db.集合名稱.findOne({條件文檔})
方法pretty():將結(jié)果格式化
db.集合名稱.find({條件文檔}).pretty()
比較運(yùn)算符
等于白热,默認(rèn)是等于判斷敛助,沒(méi)有運(yùn)算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
db.stu.find({name:'gj'})
db.stu.find({age:{$gte:18}})
邏輯運(yùn)算符
查詢時(shí)可以有多個(gè)條件,多個(gè)條件之間需要通過(guò)邏輯運(yùn)算符連接
邏輯與:默認(rèn)是邏輯與的關(guān)系
查詢年齡大于或等于18屋确,并且性別為1的學(xué)生
db.stu.find({age:{$gte:18},gender:1})
邏輯或:使用$or
查詢年齡大于18纳击,或性別為0的學(xué)生
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
and和or一起使用
查詢年齡大于18或性別為0的學(xué)生,并且學(xué)生的姓名為gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
范圍運(yùn)算符
使用"$in"攻臀,"$nin" 判斷是否在某個(gè)范圍內(nèi)
查詢年齡為18焕数、28的學(xué)生
db.stu.find({age:{$in:[18,28]}})
支持正則表達(dá)式
使用//或$regex編寫正則表達(dá)式
db.stu.find({name:/^黃/})
db.stu.find({name:{$regex:'^黃'}}})
自定義查詢
使用$where后面寫一個(gè)函數(shù),返回滿足條件的數(shù)據(jù)
查詢年齡大于30的學(xué)生
db.stu.find({$where:function(){return this.age>20}})
Limit
方法limit():用于讀取指定數(shù)量的文檔
參數(shù)NUMBER表示要獲取文檔的條數(shù)
如果沒(méi)有指定參數(shù)則顯示集合中的所有文檔
db.集合名稱.find().limit(NUMBER)
skip
方法skip():用于跳過(guò)指定數(shù)量的文檔
參數(shù)NUMBER表示跳過(guò)的記錄條數(shù)刨啸,默認(rèn)值為0
db.stu.find().skip(2)
一起使用
方法limit()和skip()可以一起使用堡赔,不分先后順序
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)