mongoDB簡單介紹

什麼是NoSQL?

NoSQL,指的是非關係型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型數據庫的數據庫管理系統的統稱。

NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。

爲什麼使用NoSQL ?

今天我們可以通過第三方平臺(如:Google,Facebook等)可以很容易的訪問和抓取數據。用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日誌已經成倍的增加。我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

RDBMS vs NoSQL

RDBMS 
- 高度組織化結構化數據 
- 結構化查詢語言(SQL) (SQL) 
- 數據和關係都存儲在單獨的表中。 
- 數據操縱語言,數據定義語言 
- 嚴格的一致性
- 基礎事務

NoSQL 
- 代表着不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理 
- 高性能,高可用性和可伸縮性

CAP定理(CAP theorem)

在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來說,不可能同時滿足以下三點:

  • 一致性(Consistency) (所有節點在同一時間具有相同的數據)
  • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)

CAP理論的核心是:一個分佈式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的滿足兩個。

因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:

  • CA - 單點集羣,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
  • CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
  • AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。

什麼是MongoDB ?

MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。

在高負載的情況下,添加更多的節點,可以保證服務器性能。

MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。

MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。

MongoDB安裝

https://www.cnblogs.com/ymwangel/p/5859453.html

主要特點

  • MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
  • 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。
  • 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分佈在計算機網絡中的其他節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
  • GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。
  • MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
  • MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

MongoDB常用命令

一、基本命令

1.創建數據庫

use test1; 

2. 查詢所有數據庫

show dbs;

3. 刪除當前使用數據庫

db.dropDatabase();

4.從指定的機器上覆制指定數據庫數據到某個數據庫 

db.copyDatabase("mydb", "temp", "127.0.0.1");

5.修復當前數據庫

db.repairDatabase();

6.查看當前使用的數據庫名稱

db.getName();

 7.顯示當前db狀態

db.stats();

8. 查看當前db版本

db.version();

 9.查看當前db的鏈接機器地址

db.getMongo();

二、Collection聚集集合 

1、創建一個聚集集合(table)

db.createCollection(“collName”, {size: 20, capped: 5, max: 100});

2、得到指定名稱的聚集集合(table)

db.getCollection("account");

3、得到當前db的所有聚集集合

db.getCollectionNames();

 三、用戶相關 

1、添加一個用戶(添加用戶、設置密碼、是否只讀)


db.addUser("name");
db.addUser("userName", "pwd123", true);

2、數據庫認證、安全模式

db.auth("userName", "123123");

3、顯示當前所有用戶

show users;

4、刪除用戶

db.removeUser("userName");

四、聚集集合查詢 

1、查詢所有記錄

db.userInfo.find();

3、查詢age = 22的記錄

db.userInfo.find({"age": 22});

4、查詢age > 22的記錄

//大於
db.userInfo.find({age: {$gt: 22}});
//小於
db.userInfo.find({age: {$lt: 22}});

 5、按照年齡排序


升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});

6、查詢name = zhangsan, age = 22的數據 

db.userInfo.find({name: 'zhangsan', age: 22});

 7、查詢前5條數據

db.userInfo.find().limit(5);

 8、查詢10條以後的數據

db.userInfo.find().skip(10);

 9、查詢在5-10之間的數據

db.userInfo.find().limit(10).skip(5);

10、查詢某個結果集的記錄條數

db.userInfo.find({age: {$gte: 25}}).count();

 11、添加一條數據

db.users.save({name: ‘zhangsan', age: 25, sex: true});

 12、修改一條數據

db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
相當於:update users set name = ‘changeName' where age = 25;

13、刪除數據

db.users.remove({age: 132});

 14、循環添加數據


> for (var i = 0; i < 30; i++) {
... db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});
... };

MongoDB事務

在分佈式存儲解決方案中談事務一直是件很痛苦的事情,而事務也成了大部分NoSQL解決方案短板所在。引入NoSQL數據庫後,文檔間ACID事務的支持通常就取消了。許多鍵/值存儲仍有ACID,但它只適用於單個條目,取消ACID的主要原因是其可擴展限制。如果文檔橫跨幾個服務器,事務將會很難實施以及性能。

MongoDB4.0 事務簡介

Mongodb4.0引入了多文檔事務的特性,mongo進行一個多文檔事務,用戶需要創建一個 Session ,然後在 Session 上開啓事務,提交事務。通過 startTransaction/ CRUD / commitTransaction 三段式來進行。

try (ClientSession clientSession = client.startSession()) {
   clientSession.startTransaction();
   collection.insertOne(clientSession, docOne);
   collection.insertOne(clientSession, docTwo);
   clientSession.commitTransaction();
}

Session

Session 是 MongoDB 3.6 版本引入的概念,引入這個特性主要就是爲實現多文檔事務做準備。Session 本質上就是一個「上下文」。

在以前的版本,MongoDB 只管理單個操作的上下文,mongod 服務進程接收到一個請求,爲該請求創建一個上下文 (源碼裏對應 OperationContext ),然後在服務整個請求的過程中一直使用這個上下文,內容包括,請求耗時統計、請求佔用的鎖資源、請求使用的存儲快照等信息。有了 Session 之後,就可以讓多個請求共享一個上下文,讓多個請求產生關聯,從而有能力支持多文檔事務。

每個 Session 包含一個唯一的標識 lsid,在 4.0 版本里,用戶的每個請求可以指定額外的擴展字段,主要包括:

  • lsid : 請求所在 Session 的 ID, 也稱 logic session id
  • txnNmuber : 請求對應的事務號,事務號在一個 Session 內必須單調遞增
  • stmtIds : 對應請求裏每個操作(以insert爲例,一個insert命令可以插入多個文檔)操作ID

實際上,用戶在使用事務時,是不需要理解這些細節,MongoDB Driver 會自動處理,Driver 在創建 Session 時分配 lsid,接下來這個 Session 裏的所以操作,Driver 會自動爲這些操作加上 lsid,如果是事務操作,會自動帶上 txnNumber。

值得一提的是,Session lsid 可以通過調用 startSession 命令讓 server 端分配,也可以客戶端自己分配,這樣可以節省一次網絡開銷;而事務的標識,MongoDB 並沒有提供一個單獨的 startTransaction 的命令,txnNumber 都是直接由 Driver 來分配的,Driver 只需保證一個 Session 內,txnNumber 是遞增的,server 端收到新的事務請求時,會主動的開始一個新事務。

 

MongoDB不適用的應用場景

綜合來看MongoDB沒有事務機制,不能很好地滿足許多複雜業務,更多的是當做一種工具,去實現某些局部、零散的需求,提高效率,而MySQL有完善的理論,可以應對絕大部分業務場景,更適合去服務各種實際應用和業務。

MongoDB適用的應用場景

1. 弱結構很適合第三方信息的抓取,不需要爲各種來源設計表結構,直接存儲,極大的減少了數據庫設計維護的工作量。 
2. 存取靈活適合於一些隨時存取,結構化要求又不高的業務場景,比如日誌文件、數據分析處理等 
3. 鍵值對是接近很多有匹配關係業務的真實應用場景,如物流(訂單、點到點)、遊戲(玩家對應的裝備)、社交(用戶之間的關係和動態)等,都能直接匹配,高效存取。
 

 

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