一、前言
MongoDB是一款比較常見的NoSQL數據庫,它以其靈活性、可伸縮性和高性能而聞名。
MongoDB的主要特點是它采用了文檔型數據存儲模型,允許開發人員以非常自然的方式組織和存儲數據。
當一些表在MySQL查詢效率不高時,可以轉為MongoDB,解決數據多查詢慢的情況!
下面我們在詳細的了解一下吧!
二、非關系數據庫
說到MongoDB,就順便說一下非關系數據庫的常見的幾種:
類型 | 名稱 | 介紹 |
文檔數據庫 | MongoDB | 使用BSON(二進制JSON)格式存儲數據,適用于半結構化數據和復雜查詢。 |
鍵值數據庫 | Redis | 用于緩存和快速數據訪問,支持復雜的數據結構,如字符串、列表、哈希等。 |
列式數據庫 | ClickHouse | 一個開源的列式數據庫管理系統,專門設計用于高性能的數據分析和OLAP(聯機分析處理)工作負載。 |
圖數據庫 | Neo4j | 用于存儲和查詢圖形數據,如社交網絡關系、知識圖譜等。 |
搜索引擎 | Elasticsearch | 分布式搜索和分析引擎,適用于全文搜索、日志分析和實時數據分析。 |
三、MongoDB介紹
MongoDB是一個開源的文檔型數據庫管理系統,它屬于非關系型數據庫的一種,主要存儲半結構化或無結構化數據,并提供靈活的數據建模和查詢能力。
MongoDB中的一條記錄就是一個文檔,它是由字段和值對組成的數據結構。MongoDB 文檔類似于 JSON 對象。字段的值可以包括其他文檔、數組和文檔數組。
使用文檔的優點是:
- 文檔對應于許多編程語言中的本機數據類型。
- 嵌入式文檔和數組減少了對昂貴連接的需求。
- 動態模式支持流暢的多態性。
「我們來比對MySQL說一下MongoDB的概念:」
最大的概念數據庫其實可以理解為一樣的,「只不過MySQL數據庫里放的是表,MongoDB里放得是文檔集合。」
所以:表(Table)與文檔集合(Collection)可以理解類似的,存儲的形式不一樣
在細化的概念就是:行(Row):行是表中的記錄,它們包含特定的字段和值文檔(Document):文檔是JSON格式的數據,它們包含了數據字段和相應的值
四、特點
1、高性能
MongoDB 提供高性能的數據持久性。特別是下面兩個方面:
- 對嵌入式數據模型的支持減少了數據庫系統上的 I/O 活動。
- 索引支持更快的查詢,并且可以包含嵌入文檔和數組中的鍵。
2、查詢接口
MongoDB 查詢 API 支持讀寫操作 (CRUD)以及:
- 復雜的數據聚合
- 文本搜索和地理空間查詢
3、高可用性
MongoDB 的復制工具稱為副本集,它提供:
- 自動故障轉移
- 數據冗余
「副本集是一組維護相同數據集的 MongoDB 服務器,提供冗余并提高數據可用性。」
4、水平擴展性
MongoDB 提供水平可擴展性作為其核心 功能的一部分:
- 分片將數據分布在機器集群上。
- 從 3.4 開始,MongoDB 支持基于分片鍵創建數據區域。
「在平衡集群中,MongoDB 將區域覆蓋的讀寫操作僅定向到該區域內的分片。」
5、支持多個存儲引擎
MongoDB 支持多種存儲引擎:
- WiredTiger 存儲引擎(包括對 靜態加密的支持)。
- 內存存儲引擎。
「此外,MongoDB提供了可插拔的存儲引擎API,允許第三方為MongoDB開發存儲引擎。」
五、應用場景
- 日志和審計數據:MongoDB可以使用MongoDB存儲應用程序日志、審計數據、操作日志、錯誤日志等。
- 產品和目錄信息:MongoDB適用于電子商務平臺,用于存儲產品信息、價格、庫存以及目錄結構。
- 時間序列數據:MongoDB可用于存儲時間序列數據,如傳感器讀數、市場行情、監控數據和日志。
- 實時事件數據:實時事件數據,如點擊流分析、用戶行為追蹤、社交媒體活動等,可以在MongoDB中存儲和分析。
- 地理信息數據:如果你需要存儲地理信息數據,如位置坐標、地圖數據或地理空間信息,MongoDB的地理空間功能非常有用。
- 會話數據:MongoDB可以用于存儲Web應用程序的會話數據,以實現用戶身份驗證和會話管理。
- 用戶數據:你可以使用MongoDB存儲用戶配置文件、個人信息、登錄憑據等用戶相關數據。
- 大數據分析:MongoDB在大數據分析領域也有廣泛應用,可以存儲和分析大規模數據集,支持實時分析和報告。
- 博客和內容管理:MongoDB適合存儲博客文章、評論、標簽和多媒體內容。
「當然有些東西Redis也可以實現,具體情況在根據公司情況進行選擇,不要死板哈!」
六、安裝與Navicat連接
1、安裝
本次使用Docker安裝比較省心,當然也可以下載客戶端裝在Linux中,不太建議裝在Windows中。
不想裝虛擬機的話,裝也是可以的,就不帶大家安裝了,直接給地址自行下載哈:
mongodb下載地址:https://www.mongodb.com/try/download/community
目前最新版本:7.0.1
運行命令之前,需要在宿主機上創建文件夾用于掛載數據,創建完文件夾記得給修改權限。
自己測試玩,可以不掛載,生產上也不太建議使用Docker安裝!
docker run -d --name mongodb --restart always -p 27017:27017 -v /data/mongo:/data/db mongo
2、測試連接
我們沒有設置密碼,大家也可以設置一下!
剛剛創建的是一個空的數據庫,需要我們自己創建一個數據庫:
創建完成:
對于數據庫API操作大家可以看文檔來走一遍,這里就不具體演示,我們還是以在Springboot程序中來使用演示為主:
MongoDB API文檔:https://www.mongodb.com/docs/manual/tutorial/insert-documents/
六、整合Springboot
1、導入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、配置yml
server:
port: 8086
spring:
data:
mongodb:
host: 192.168.239.130
port: 27017
database: test
3、使用方式選擇
「這里說一下有個特殊點:」在 MongoDB 中,存儲在集合中的每個文檔都需要一個唯一的 _id字段作為主鍵。如果插入的文檔省略了該_id字段,MongoDB 驅動程序會自動為該字段生成一個_id,還會新增一個_class字段,來存在全類名。如果有個字段為id,也會轉化為_id!
這里分為兩種使用形式,一種是直接使用MongoTemplate,第二種就是extends MongoRepository<MyDocument, String>,來實現各種API。
這兩種方式沒有什么區別,不想寫一個接口來繼承的話,直接使用template也是沒問題的!
「制定了MongoRepository<CommonLog, String>就不需要每次操作的時候指定,像MongoTemplate就需要每次操作來指定是那個類。」
我們以第一種來使用,當然第二種的使用也給大家參考:
public interface CommonLogRepository extends MongoRepository<CommonLog, String> {
}
4、CRUD操作
簡單的寫在Controller里了
「新增如果數據庫中不存在文檔就會自動新增并把記錄插入,還是很智能的!」
「新增:」
private final MongoTemplate mongoTemplate;
@PostMapping("saveCommonLog")
public CommonLog saveCommonLog() {
CommonLog commonLog = new CommonLog();
commonLog.setOperIp("127.0.0.1");
commonLog.setBusinessType(1);
commonLog.setOperUrl("https://baidu.com");
commonLog.setOperName("我是新增");
commonLog.setTitle("測試第一條記錄");
commonLog.setRequestMethod("get");
commonLog.setOperTime(new Date());
return mongoTemplate.save(commonLog);
}
「查詢所有:」
@GetMapping("getAllCommonLogs")
public List<CommonLog> getAllCommonLogs() {
return mongoTemplate.findAll(CommonLog.class);
}
「根據ID查詢:」
@GetMapping("getCommonLogById")
public CommonLog getCommonLogById(@RequestParam String id) {
return mongoTemplate.findById(id, CommonLog.class);
}
「兩種更新操作:」
@PostMapping("/updateCommonLog")
public void updateCommonLog(){
// 第一種
CommonLog commonLog = mongoTemplate.findById("65151ce0112fec57886da00c", CommonLog.class);
if (commonLog != null) {
commonLog.setOperName("我修改了你");
mongoTemplate.save(commonLog);
}
// 第二種
Query query = Query.query(Criteria.where("id").is("65151d8f112fec57886da00d"));
Update update = new Update().set("requestMethod", "update");
mongoTemplate.updateFirst(query, update, CommonLog.class);
}
「根據id刪除:」
@DeleteMapping("deleteCommonLogById")
public void deleteCommonLogById(@RequestParam String id) {
mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), CommonLog.class);
}
七、總結
我們從非關系型數據庫為切入點,引入了MongoDB,在進行介紹,著重介紹了特點,還有眾多應用場景。
從安裝到連接,開始了整合Springboot實戰,帶大家進行CRUD實戰操作。不知道大家有沒有對MongoDB有了進一步的了解呢!
「趕快在項目中使用一下吧,有的時候不是需要這個技術來解決什么痛點,有時就是自己想拓展一下自己的技術棧,當然前提是在不影響系統的情況下哈!」