mongodb學習整理

Mongodb簡介

MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構非常鬆散,是似 json 的 bson (binary Serialized document notation)格式,因此可以存儲比較複雜的數據類型。 MongoDB 最大特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言幾乎可以實現類似關係數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。它是一個面向集合的,模式自由的文檔型數據庫。面向集合意思是數據被分組存儲在數據集中, 被稱爲一個集合( Collenction)。每個集合在數據庫中都有一個唯一的標識名,並且可以包含無限數目的文檔。集合的概念類似關係型數據庫( RDBMS)裏的表( table), 不同的是它不需要定義任何模式( schema)。

MongoDB 的邏輯結構是一種層次結構。主要由:文檔(document)、集合(collection)、數據庫(database)這三部分組成的。
* MongoDB 的文檔( document), 相當於關係數據庫中的一行記錄。
* 多個文檔組成一個集合( collection), 相當於關係數據庫的表。
* 多個集合( collection), 邏輯上組織在一起,就是數據庫( database)。
* 一個 MongoDB 實例支持多個數據庫( database)。
這裏寫圖片描述

預分配機制

MongoDB 內部有預分配空間的機制,每個預分配的文件都用 0 進行填充,由於有了這個機制, MongoDB 始終保持額外的空間和空餘的數據文件,從而有效避免了由於數據暴增而帶來
的磁盤壓力過大的問題。

文件大小分配機制

由於表中數據量的增加,數據文件每新分配一次,它的大小都會是上一個數據文件大小的 2倍,每個數據文件最大 2G。這樣的機制有利於防止較小的數據庫浪費過多的磁盤空間,同時又能保證較大的數據庫有相應的預留空間使用。

命名空間

數據庫的每張表都對應一個命名空間,每個索引也有對應的命名空間。這些命名空間的元數
據都集中在*.ns 文件中。

查詢語言

MongoDB 最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,其查詢條件和插入對象的方式都是使用json的方式,這點對應的查詢條件和elasticSearch對應的查詢條件非常類似,比如:

查詢條件是 { a:A, b:B, … } 類似 “ where a==A and b==B and …” 

基礎操作

可以參考文檔:https://docs.mongodb.com/manual/reference/operator/query-logical/
* 查詢和投影操作find

(1) 多條件查詢and
db.things.find({x:4,j:1});   #這裏的db是指當前所在的數據庫,things對應的表
也可以使用下面的方式來替代
db.things.find({$and:[{x:4},{j:5}]});
相當於:select * from things where x=4 and j = 1
其中$and 語法如下:
Syntax: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
(2) 返回制定字段查詢
db.things.find({x:4},{j:true});
相當於:select j from things where x = 4;
db.things.find({x:4},{j:true,x:true});
相當於: select x,j from things where x = 4;
注意一點是db.things.find({x:4},{j:true});會返回mongodb給每一個記錄自動生成的_id字段
其中投影project語法如下:
find({查詢條件對應的json},{投影字段對應的json})
(3) or 查詢
db.things.find({$or:[{x:4},{j:5}]});
相當於:select * from things where x=4 or j = 5;
其中$or 語法如下:
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
(4) not 查詢
db.things.find({j:{$not: {$gt: 3}}});
相當於:   select * from things where j <=3;
其中 $not 語法如下:
Syntax: { field: { $not: { <operator-expression> } } }
(5) limit 限制返回記錄的條數
db.things.find().limit(3);
相當於:select * from things limit 3;
  • 查詢操作findone
返回結果集合中的第一條記錄
  • 更新操作update
db.things.update({j:1},{$set:{j:-1}})
相當於:update things set j=-1 where j = 1 
其中update對應的語法如下:
update({查詢條件},{更新操作})
  • 刪除操作remove
db.things.remove({j:-1})
相當於:delete from things where j = -1
其中remove對應的語法如下:
remove({查詢條件})

高級操作

可以參考:https://docs.mongodb.com/manual/
* capped collection

capped collections 是性能出色的有着固定大小的集合,
以 LRU(Least Recently Used 最近最少使用)規則和插入順序進行 age-out(老化移出)處理,
自動維護集合中對象的插入順序,在創建時要預先指定大小。
如果空間用完,新添加的對象將會取代集合中最舊的對象。
  • GridFS
由於 MongoDB 中 BSON 對象大小是有限制的,所以 GridFS 規範提供了一種透明的機制,
可以將一個大文件分割成爲多個較小的文檔,
這樣的機制允許我們有效的保存大文件對象,特別對於那些巨大的文件,比如視頻、高清圖片等
  • MapReduce
MongoDB 的 MapReduce 相當於 Mysql 中的"group by",
所以在 MongoDB 上使用 Map/Reduce進行並行"統計"很容易
  • 索引
MongoDB 提供了多樣性的索引支持,索引信息被保存在 system.indexes 中,且默認總是爲_id創建索引,
它的索引使用基本和 MySQL 等關係型數據庫一樣。其實可以這樣說說,索引是凌駕於數據存儲系統之上的另一層系統,
所以各種結構迥異的存儲都有相同或相似的索引實現及使用接口並不足爲奇

參考

https://docs.mongodb.com/manual/

轉載請說明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章