BSON
BSON是一種類似JSON的二進制形式的存儲格式卒煞,簡稱Binary JSON狸驳。它和JSON一樣藕咏,支持內(nèi)嵌的文檔對象和數(shù)組對象再层,但是BSON有JSON沒有的一些數(shù)據(jù)類型贸铜,如Date和BinData類型。它支持下面數(shù)據(jù)類型聂受。每個數(shù)據(jù)類型對應(yīng)一個數(shù)字蒿秦,在MongoDB中可以使用$type操作符查看相應(yīng)的文檔的BSON類型
類型 | 對應(yīng)數(shù)字 | 別名 | 說明 |
---|---|---|---|
Double1 | 1 | double | |
String | 2 | string | |
Object | 3 | object | |
Array | 4 | array | |
Binary data | 5 | binData | |
Undefined | 6 | undefined | 棄用 |
ObjectId | 7 | objectId | |
Boolean | 8 | “bool” | |
Date | 9 | “date” | |
Null | 10 | “null” | |
Regular Expression | 11 | “regex” | |
DBPointer | 12 | “dbPointer” | |
JavaScript | 13 | “javascript” | |
Symbol | 14 | “symbol” | |
JavaScript(with scope) | 15 | “javascriptWithScope” | |
32-bit integer | 16 | “int” | |
Timestamp | 17 | “timestamp” | |
64-bit integer | 18 | “l(fā)ong” | |
Min key | -1 | “minKey” | |
Max key | 127 | “maxKey” |
CRUD
增刪改差操作
增
db.collection.insert()、db.collection.insertOne()蛋济、db.collection.insertMany()棍鳖,后兩個在3.2版本新加入。在mongodb中碗旅,插入作用于單個集合collection渡处。
在mongodb中,所有的寫操作在單個文檔的層面上是原子的扛芽。如果一個操作涉及多個文檔的寫操作骂蓖,那么單個文檔的寫操作是原子的,整個操作不是院子的川尖。
_id是每個文檔都會有的主鍵登下。如果插入的時候沒有指定_id茫孔,那么mongodb會自動生成一個ObjectId作為_id。
ObjectId是mongodb中的一個數(shù)據(jù)類型被芳。
db.users.insert(
{
name: "sue",
age: 19,
status: "P"
}
)
這里插入的是json格式的數(shù)據(jù)缰贝,mongodb轉(zhuǎn)化為bson格式進行保存。
db.collection.insertOne() 插入一個畔濒,db.collection.insertMany() 插入多個剩晴,insert可以一個可以多個。
mongodb插入數(shù)據(jù)還有db.collection.save()侵状。save的插入邏輯如下:如果沒有指定_id赞弥,則會直接調(diào)用insert命令進行插入;如果指定了_id趣兄,那么會調(diào)用update()命令同時指定upsert為true绽左,即有對應(yīng)的就更新,沒有對應(yīng)的就插入艇潭。
刪
db.collection.remove()拼窥、db.collection.deleteOne()、db.collection.deleteMany()蹋凝,分別是普通刪除鲁纠、刪除一個、刪除多個鳍寂。
通過傳入過濾器進行刪除操作改含,這里的過濾器是指json文檔。mongodb會對符合json過濾器的文檔進行刪除伐割。如果傳入一個空過濾器候味,會刪除所有文檔(只限于db.collection.remove()和db.collection.deleteMany())刃唤。
如果想刪除多個文檔隔心,使用remove和deleteMany;如果想刪除一個文檔尚胞,使用remove(將第二個參數(shù)設(shè)為 1)和deleteOne硬霍。
db.users.remove( { status: "D" }, 1)
此時remove只會刪除一個文檔。當不使用第二個參數(shù)時笼裳,為刪除多個唯卖。
改
db.collection.updateOne():更新一個
db.collection.updateMany():更新多個
db.collection.replaceOne():替換一個
db.collection.update():默認更新一個,可以使用multi參數(shù)設(shè)定更新多個
接收參數(shù)為:
- 過濾條件文檔躬柬,包括普通的文檔和使用查詢操作符的文檔拜轨。
- 更新文檔
- 更新選項,比如update中是否進行upsert允青,是否對多個文檔更新multi
一般使用update進行更新操作橄碾。因為update支持操作符更新,replace只能更新全文檔。
查
db.collection.find():查詢操作
-
query:過濾條件法牲,為一個json文檔史汗。分為普通文檔和使用操作符的文檔。
查詢操作符:{ <field1>: { <operator1>: <value1> }, ... }拒垃,這里field1為查詢字段名停撞,operator1為查詢操作符,value1為查詢值悼瓮。
AND操作:直接在文檔里并排表示
OR操作:使用$or操作符 {$or: [ { status: "A" }, { age: { $lt: 30 } } ] }
嵌入文檔查詢戈毒,有兩種方式。第一種將整個嵌入文檔完整查詢横堡。比如{"comments" : {"one" : 1, "two" : 2}}副硅,此時嵌入文檔只能完整查詢,不能只查詢其中的某些字段翅萤,比如{"comments" : {"one" : 1}}是查不到數(shù)據(jù)的恐疲。第二種是嵌入文檔的某些字段的查詢,使用{"comments.one" : 1}套么,用英文句號表示嵌入文檔的字段培己,可以只查詢某些字段。
數(shù)組查詢胚泌。如果寫上數(shù)組標識[ ]省咨,這時只會查詢完整符合查詢條件的數(shù)組,比如{ badges: [ "blue", "black" ] }玷室,元素內(nèi)容和順序都不能錯零蓉。如果只想查詢某個元素,則{ badges: "black" }穷缤。如果想查詢某個位置的元素敌蜂,使用英文句號{ "badges.0": "black" }。 field:返回的字段津肛,用json文檔鍵值對表示章喉,1或true表示返回,0或false表示不返回身坐。嵌入文檔的字段同查詢一樣秸脱,使用英文句號分割
limit:限制返回文檔的個數(shù)
skip:跳過指定的文檔個數(shù)
sort:排序,使用json鍵值對文檔進行表示部蛇,1 為升序摊唇,-1 為降序。
游標:mongodb會把find結(jié)果返回為一個游標涯鲁,在shell和java client中都是這樣巷查。使用游標去迭代數(shù)據(jù)嘹害,可以防止單次傳輸大量數(shù)據(jù)。
先 sort 再 skip 再 limit
索引
mongodb支持單字段索引吮便、復(fù)合索引笔呀、多key索引、文本索引髓需、地理位置索引等许师。
- 單字段索引:例如
db.person.createIndex( {age: 1} )
×糯遥可以加速對age字段的各種查詢請求微渠,默認的_id索引也是單字段索引。{age: 1} 代表升序索引咧擂,也可以通過{age: -1}來指定降序索引逞盆,對于單字段索引,升序/降序效果是一樣的松申。 - 復(fù)合索引:針對多個字段聯(lián)合創(chuàng)建索引云芦,先按第一個字段排序,第一個字段相同的文檔按第二個字段排序贸桶,依次類推舅逸。例如
db.person.createIndex( {age: 1, name: 1} )
。復(fù)合索引可以支持多個字段的組合查詢皇筛,也能滿足符合索引前綴的查詢琉历。除了查詢的需求能夠影響索引的順序,字段值的分布也是一個重要的因素水醋,查詢的時候也要考慮字段的順序旗笔。 - 多key索引:當索引的字段為數(shù)組時,創(chuàng)建的索引為多key索引拄踪。duokey索引會為數(shù)組中的每個元素建立一條索引蝇恶。
- 文本索引:能夠進行文本內(nèi)容搜索,性能不好宫蛆。
- 地理位置索引:可以對地理位置進行索引艘包,一般用于定位需求的猛。
在mongodb中耀盗,索引滿足前綴索引,這是由mongodb的索引實現(xiàn)造成的卦尊。mongodb默認的索引實現(xiàn)為B樹叛拷,是一種針對磁盤IO進行優(yōu)化的樹。在B樹中岂却,節(jié)點中的數(shù)據(jù)范圍是順序排列的忿薇,所以可以實現(xiàn)前綴索引裙椭。有的mongodb存儲引擎支持哈希索引,查詢速度更快署浩,但是不能進行范圍搜索揉燃。
在mongodb中,可以為索引設(shè)置一些屬性:
- 唯一索引:索引的字段不能出現(xiàn)重復(fù)值筋栋,比如_id索引
- TTL索引:可以針對某個時間字段炊汤,指定文檔的過期時間(經(jīng)過指定時間后過期 或 在某個時間點過期)
- 部分索引:只針對某個特定條件的文檔建立索引,3.2后支持
- 稀疏索引:只針對存在索引字段的文檔建立索引弊攘,可看做是部分索引的一種特殊情況
索引優(yōu)化
mongodb支持對請求進行profiling抢腐。目前支持三種級別的profiling:
- 0:不開啟profiling
- 1:將處理時間超過某個閾值(默認100ms)的請求,記錄到DB下的system.profile集合
- 2:將所有的請求都記錄到system.profile集合
通常襟交,生產(chǎn)環(huán)境建議使用1級別的profiling迈倍,并根據(jù)自身需求配置合理的閾值,用于監(jiān)測慢請求的情況捣域,并及時的做索引優(yōu)化啼染。
索引過多會造成寫入、更新的性能地下焕梅,索引并不是越多越好提完,需要根據(jù)實際情況進行優(yōu)化。