Mongodb簡介
MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是似 json 的 bson (binary Serialized document notation)格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。 MongoDB 最大特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。它是一個面向集合的,模式自由的文檔型數(shù)據(jù)庫。面向集合意思是數(shù)據(jù)被分組存儲在數(shù)據(jù)集中, 被稱為一個集合( Collenction)。每個集合在數(shù)據(jù)庫中都有一個唯一的標(biāo)識名,并且可以包含無限數(shù)目的文檔。集合的概念類似關(guān)系型數(shù)據(jù)庫( RDBMS)里的表( table), 不同的是它不需要定義任何模式( schema)。
MongoDB 的邏輯結(jié)構(gòu)是一種層次結(jié)構(gòu)。主要由:文檔(document)、集合(collection)、數(shù)據(jù)庫(database)這三部分組成的。
- MongoDB 的文檔( document), 相當(dāng)于關(guān)系數(shù)據(jù)庫中的一行記錄。
- 多個文檔組成一個集合( collection), 相當(dāng)于關(guān)系數(shù)據(jù)庫的表。
- 多個集合( collection), 邏輯上組織在一起,就是數(shù)據(jù)庫( database)。
-
一個 MongoDB 實(shí)例支持多個數(shù)據(jù)庫( database)。
mongodb和關(guān)系型數(shù)據(jù)庫對比
預(yù)分配機(jī)制
MongoDB 內(nèi)部有預(yù)分配空間的機(jī)制,每個預(yù)分配的文件都用 0 進(jìn)行填充,由于有了這個機(jī)制, MongoDB 始終保持額外的空間和空余的數(shù)據(jù)文件,從而有效避免了由于數(shù)據(jù)暴增而帶來
的磁盤壓力過大的問題。
文件大小分配機(jī)制
由于表中數(shù)據(jù)量的增加,數(shù)據(jù)文件每新分配一次,它的大小都會是上一個數(shù)據(jù)文件大小的 2倍,每個數(shù)據(jù)文件最大 2G。這樣的機(jī)制有利于防止較小的數(shù)據(jù)庫浪費(fèi)過多的磁盤空間,同時又能保證較大的數(shù)據(jù)庫有相應(yīng)的預(yù)留空間使用。
命名空間
數(shù)據(jù)庫的每張表都對應(yīng)一個命名空間,每個索引也有對應(yīng)的命名空間。這些命名空間的元數(shù)據(jù)都集中在*.ns 文件中。
查詢語言
MongoDB 最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,其查詢條件和插入對象的方式都是使用json的方式,這點(diǎn)對應(yīng)的查詢條件和elasticSearch對應(yīng)的查詢條件非常類似,比如:
查詢條件是 { a:A, b:B, … } 類似 “ where a==A and b==B and …”
基礎(chǔ)操作
可以參考文檔:https://docs.mongodb.com/manual/reference/operator/query-logical/
- 查詢和投影操作find
(1) 多條件查詢and
db.things.find({x:4,j:1}); #這里的db是指當(dāng)前所在的數(shù)據(jù)庫,things對應(yīng)的表
也可以使用下面的方式來替代
db.things.find({$and:[{x:4},{j:5}]});
相當(dāng)于:select * from things where x=4 and j = 1
其中$and 語法如下:
Syntax: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
(2) 返回制定字段查詢
db.things.find({x:4},{j:true});
相當(dāng)于:select j from things where x = 4;
db.things.find({x:4},{j:true,x:true});
相當(dāng)于: select x,j from things where x = 4;
注意一點(diǎn)是db.things.find({x:4},{j:true});會返回mongodb給每一個記錄自動生成的_id字段
其中投影project語法如下:
find({查詢條件對應(yīng)的json},{投影字段對應(yīng)的json})
(3) or 查詢
db.things.find({$or:[{x:4},{j:5}]});
相當(dāng)于:select * from things where x=4 or j = 5;
其中$or 語法如下:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
(4) not 查詢
db.things.find({j:{$not: {$gt: 3}}});
相當(dāng)于: select * from things where j <=3;
其中 $not 語法如下:
Syntax: { field: { $not: { <operator-expression> } } }
(5) limit 限制返回記錄的條數(shù)
db.things.find().limit(3);
相當(dāng)于:select * from things limit 3;
- 查詢操作findone
返回結(jié)果集合中的第一條記錄
- 更新操作update
db.things.update({j:1},{$set:{j:-1}})
相當(dāng)于:update things set j=-1 where j = 1
其中update對應(yīng)的語法如下:
update({查詢條件},{更新操作})
- 刪除操作remove
db.things.remove({j:-1})
相當(dāng)于:delete from things where j = -1
其中remove對應(yīng)的語法如下:
remove({查詢條件})
高級操作
可以參考:https://docs.mongodb.com/manual/
- capped collection
capped collections 是性能出色的有著固定大小的集合,以 LRU(Least Recently Used 最近最少使用)規(guī)則和插入順序進(jìn)行 age-out(老化移出)處理,自動維護(hù)集合中對象的插入順序,在創(chuàng)建時要預(yù)先指定大小。如果空間用完,新添加的對象將會取代集合中最舊的對象。
- GridFS
由于 MongoDB 中 BSON 對象大小是有限制的,所以 GridFS 規(guī)范提供了一種透明的機(jī)制,可以將一個大文件分割成為多個較小的文檔,這樣的機(jī)制允許我們有效的保存大文件對象,特別對于那些巨大的文件,比如視頻、高清圖片等
- MapReduce
MongoDB 的 MapReduce 相當(dāng)于 Mysql 中的"group by",所以在 MongoDB 上使用 Map/Reduce進(jìn)行并行"統(tǒng)計(jì)"很容易
- 索引
MongoDB 提供了多樣性的索引支持,索引信息被保存在 system.indexes 中,且默認(rèn)總是為_id創(chuàng)建索引,它的索引使用基本和 MySQL 等關(guān)系型數(shù)據(jù)庫一樣。其實(shí)可以這樣說說,索引是凌駕于數(shù)據(jù)存儲系統(tǒng)之上的另一層系統(tǒng),所以各種結(jié)構(gòu)迥異的存儲都有相同或相似的索引實(shí)現(xiàn)及使用接口并不足為奇
參考
https://docs.mongodb.com/manual/
轉(zhuǎn)載請說明出處
