MongoDB從入門(mén)到精通、Springboot整合MongoDB

一、前言
MongoDB是一款比較常見(jiàn)的NoSQL數(shù)據(jù)庫(kù),它以其靈活性、可伸縮性和高性能而聞名。
MongoDB的主要特點(diǎn)是它采用了文檔型數(shù)據(jù)存儲(chǔ)模型,允許開(kāi)發(fā)人員以非常自然的方式組織和存儲(chǔ)數(shù)據(jù)。
當(dāng)一些表在MySQL查詢效率不高時(shí),可以轉(zhuǎn)為MongoDB,解決數(shù)據(jù)多查詢慢的情況!
下面我們?cè)谠敿?xì)的了解一下吧!
二、非關(guān)系數(shù)據(jù)庫(kù)
說(shuō)到MongoDB,就順便說(shuō)一下非關(guān)系數(shù)據(jù)庫(kù)的常見(jiàn)的幾種:
類(lèi)型 | 名稱(chēng) | 介紹 |
文檔數(shù)據(jù)庫(kù) | MongoDB | 使用BSON(二進(jìn)制JSON)格式存儲(chǔ)數(shù)據(jù),適用于半結(jié)構(gòu)化數(shù)據(jù)和復(fù)雜查詢。 |
鍵值數(shù)據(jù)庫(kù) | Redis | 用于緩存和快速數(shù)據(jù)訪問(wèn),支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如字符串、列表、哈希等。 |
列式數(shù)據(jù)庫(kù) | ClickHouse | 一個(gè)開(kāi)源的列式數(shù)據(jù)庫(kù)管理系統(tǒng),專(zhuān)門(mén)設(shè)計(jì)用于高性能的數(shù)據(jù)分析和OLAP(聯(lián)機(jī)分析處理)工作負(fù)載。 |
圖數(shù)據(jù)庫(kù) | Neo4j | 用于存儲(chǔ)和查詢圖形數(shù)據(jù),如社交網(wǎng)絡(luò)關(guān)系、知識(shí)圖譜等。 |
搜索引擎 | Elasticsearch | 分布式搜索和分析引擎,適用于全文搜索、日志分析和實(shí)時(shí)數(shù)據(jù)分析。 |
三、MongoDB介紹
MongoDB是一個(gè)開(kāi)源的文檔型數(shù)據(jù)庫(kù)管理系統(tǒng),它屬于非關(guān)系型數(shù)據(jù)庫(kù)的一種,主要存儲(chǔ)半結(jié)構(gòu)化或無(wú)結(jié)構(gòu)化數(shù)據(jù),并提供靈活的數(shù)據(jù)建模和查詢能力。
MongoDB中的一條記錄就是一個(gè)文檔,它是由字段和值對(duì)組成的數(shù)據(jù)結(jié)構(gòu)。MongoDB 文檔類(lèi)似于 JSON 對(duì)象。字段的值可以包括其他文檔、數(shù)組和文檔數(shù)組。

使用文檔的優(yōu)點(diǎn)是:
- 文檔對(duì)應(yīng)于許多編程語(yǔ)言中的本機(jī)數(shù)據(jù)類(lèi)型。
- 嵌入式文檔和數(shù)組減少了對(duì)昂貴連接的需求。
- 動(dòng)態(tài)模式支持流暢的多態(tài)性。
「我們來(lái)比對(duì)MySQL說(shuō)一下MongoDB的概念:」
最大的概念數(shù)據(jù)庫(kù)其實(shí)可以理解為一樣的,「只不過(guò)MySQL數(shù)據(jù)庫(kù)里放的是表,MongoDB里放得是文檔集合。」
所以:表(Table)與文檔集合(Collection)可以理解類(lèi)似的,存儲(chǔ)的形式不一樣
在細(xì)化的概念就是:行(Row):行是表中的記錄,它們包含特定的字段和值文檔(Document):文檔是JSON格式的數(shù)據(jù),它們包含了數(shù)據(jù)字段和相應(yīng)的值

四、特點(diǎn)
1、高性能
MongoDB 提供高性能的數(shù)據(jù)持久性。特別是下面兩個(gè)方面:
- 對(duì)嵌入式數(shù)據(jù)模型的支持減少了數(shù)據(jù)庫(kù)系統(tǒng)上的 I/O 活動(dòng)。
- 索引支持更快的查詢,并且可以包含嵌入文檔和數(shù)組中的鍵。
2、查詢接口
MongoDB 查詢 API 支持讀寫(xiě)操作 (CRUD)以及:
- 復(fù)雜的數(shù)據(jù)聚合
- 文本搜索和地理空間查詢
3、高可用性
MongoDB 的復(fù)制工具稱(chēng)為副本集,它提供:
- 自動(dòng)故障轉(zhuǎn)移
- 數(shù)據(jù)冗余
「副本集是一組維護(hù)相同數(shù)據(jù)集的 MongoDB 服務(wù)器,提供冗余并提高數(shù)據(jù)可用性。」
4、水平擴(kuò)展性
MongoDB 提供水平可擴(kuò)展性作為其核心 功能的一部分:
- 分片將數(shù)據(jù)分布在機(jī)器集群上。
- 從 3.4 開(kāi)始,MongoDB 支持基于分片鍵創(chuàng)建數(shù)據(jù)區(qū)域。
「在平衡集群中,MongoDB 將區(qū)域覆蓋的讀寫(xiě)操作僅定向到該區(qū)域內(nèi)的分片。」
5、支持多個(gè)存儲(chǔ)引擎
MongoDB 支持多種存儲(chǔ)引擎:
- WiredTiger 存儲(chǔ)引擎(包括對(duì) 靜態(tài)加密的支持)。
- 內(nèi)存存儲(chǔ)引擎。
「此外,MongoDB提供了可插拔的存儲(chǔ)引擎API,允許第三方為MongoDB開(kāi)發(fā)存儲(chǔ)引擎。」
五、應(yīng)用場(chǎng)景
- 日志和審計(jì)數(shù)據(jù):MongoDB可以使用MongoDB存儲(chǔ)應(yīng)用程序日志、審計(jì)數(shù)據(jù)、操作日志、錯(cuò)誤日志等。
- 產(chǎn)品和目錄信息:MongoDB適用于電子商務(wù)平臺(tái),用于存儲(chǔ)產(chǎn)品信息、價(jià)格、庫(kù)存以及目錄結(jié)構(gòu)。
- 時(shí)間序列數(shù)據(jù):MongoDB可用于存儲(chǔ)時(shí)間序列數(shù)據(jù),如傳感器讀數(shù)、市場(chǎng)行情、監(jiān)控?cái)?shù)據(jù)和日志。
- 實(shí)時(shí)事件數(shù)據(jù):實(shí)時(shí)事件數(shù)據(jù),如點(diǎn)擊流分析、用戶行為追蹤、社交媒體活動(dòng)等,可以在MongoDB中存儲(chǔ)和分析。
- 地理信息數(shù)據(jù):如果你需要存儲(chǔ)地理信息數(shù)據(jù),如位置坐標(biāo)、地圖數(shù)據(jù)或地理空間信息,MongoDB的地理空間功能非常有用。
- 會(huì)話數(shù)據(jù):MongoDB可以用于存儲(chǔ)Web應(yīng)用程序的會(huì)話數(shù)據(jù),以實(shí)現(xiàn)用戶身份驗(yàn)證和會(huì)話管理。
- 用戶數(shù)據(jù):你可以使用MongoDB存儲(chǔ)用戶配置文件、個(gè)人信息、登錄憑據(jù)等用戶相關(guān)數(shù)據(jù)。
- 大數(shù)據(jù)分析:MongoDB在大數(shù)據(jù)分析領(lǐng)域也有廣泛應(yīng)用,可以存儲(chǔ)和分析大規(guī)模數(shù)據(jù)集,支持實(shí)時(shí)分析和報(bào)告。
- 博客和內(nèi)容管理:MongoDB適合存儲(chǔ)博客文章、評(píng)論、標(biāo)簽和多媒體內(nèi)容。
「當(dāng)然有些東西Redis也可以實(shí)現(xiàn),具體情況在根據(jù)公司情況進(jìn)行選擇,不要死板哈!」
六、安裝與Navicat連接
1、安裝
本次使用Docker安裝比較省心,當(dāng)然也可以下載客戶端裝在Linux中,不太建議裝在Windows中。
不想裝虛擬機(jī)的話,裝也是可以的,就不帶大家安裝了,直接給地址自行下載哈:
mongodb下載地址:https://www.mongodb.com/try/download/community
目前最新版本:7.0.1
運(yùn)行命令之前,需要在宿主機(jī)上創(chuàng)建文件夾用于掛載數(shù)據(jù),創(chuàng)建完文件夾記得給修改權(quán)限。
自己測(cè)試玩,可以不掛載,生產(chǎn)上也不太建議使用Docker安裝!
docker run -d --name mongodb --restart always -p 27017:27017 -v /data/mongo:/data/db mongo2、測(cè)試連接
我們沒(méi)有設(shè)置密碼,大家也可以設(shè)置一下!

剛剛創(chuàng)建的是一個(gè)空的數(shù)據(jù)庫(kù),需要我們自己創(chuàng)建一個(gè)數(shù)據(jù)庫(kù):

創(chuàng)建完成:

對(duì)于數(shù)據(jù)庫(kù)API操作大家可以看文檔來(lái)走一遍,這里就不具體演示,我們還是以在Springboot程序中來(lái)使用演示為主:
MongoDB API文檔:https://www.mongodb.com/docs/manual/tutorial/insert-documents/
六、整合Springboot
1、導(dǎo)入依賴
<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: test3、使用方式選擇
「這里說(shuō)一下有個(gè)特殊點(diǎn):」在 MongoDB 中,存儲(chǔ)在集合中的每個(gè)文檔都需要一個(gè)唯一的 _id字段作為主鍵。如果插入的文檔省略了該_id字段,MongoDB 驅(qū)動(dòng)程序會(huì)自動(dòng)為該字段生成一個(gè)_id,還會(huì)新增一個(gè)_class字段,來(lái)存在全類(lèi)名。如果有個(gè)字段為id,也會(huì)轉(zhuǎn)化為_(kāi)id!

這里分為兩種使用形式,一種是直接使用MongoTemplate,第二種就是extends MongoRepository<MyDocument, String>,來(lái)實(shí)現(xiàn)各種API。
這兩種方式?jīng)]有什么區(qū)別,不想寫(xiě)一個(gè)接口來(lái)繼承的話,直接使用template也是沒(méi)問(wèn)題的!
「制定了MongoRepository<CommonLog, String>就不需要每次操作的時(shí)候指定,像MongoTemplate就需要每次操作來(lái)指定是那個(gè)類(lèi)。」
我們以第一種來(lái)使用,當(dāng)然第二種的使用也給大家參考:
public interface CommonLogRepository extends MongoRepository<CommonLog, String> {
}4、CRUD操作
簡(jiǎn)單的寫(xiě)在Controller里了
「新增如果數(shù)據(jù)庫(kù)中不存在文檔就會(huì)自動(dòng)新增并把記錄插入,還是很智能的!」
「新增:」
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("測(cè)試第一條記錄");
commonLog.setRequestMethod("get");
commonLog.setOperTime(new Date());
return mongoTemplate.save(commonLog);
}
「查詢所有:」
@GetMapping("getAllCommonLogs")
public List<CommonLog> getAllCommonLogs() {
return mongoTemplate.findAll(CommonLog.class);
}
「根據(jù)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);
}
「根據(jù)id刪除:」
@DeleteMapping("deleteCommonLogById")
public void deleteCommonLogById(@RequestParam String id) {
mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), CommonLog.class);
}
七、總結(jié)
我們從非關(guān)系型數(shù)據(jù)庫(kù)為切入點(diǎn),引入了MongoDB,在進(jìn)行介紹,著重介紹了特點(diǎn),還有眾多應(yīng)用場(chǎng)景。
從安裝到連接,開(kāi)始了整合Springboot實(shí)戰(zhàn),帶大家進(jìn)行CRUD實(shí)戰(zhàn)操作。不知道大家有沒(méi)有對(duì)MongoDB有了進(jìn)一步的了解呢!
「趕快在項(xiàng)目中使用一下吧,有的時(shí)候不是需要這個(gè)技術(shù)來(lái)解決什么痛點(diǎn),有時(shí)就是自己想拓展一下自己的技術(shù)棧,當(dāng)然前提是在不影響系統(tǒng)的情況下哈!」





























