php網(wǎng)站模板源碼長(zhǎng)沙seo優(yōu)化推廣
🏝? 博主介紹
大家好,我是一個(gè)搬磚的農(nóng)民工,很高興認(rèn)識(shí)大家 😊 ~
👨?🎓 個(gè)人介紹:本人是一名后端Java開(kāi)發(fā)工程師,坐標(biāo)北京 ~
🎉 感謝關(guān)注 📖 一起學(xué)習(xí) 📝 一起討論 🌈 一起進(jìn)步 ~
🙏 作者水平有限,歡迎各位大佬指正留言,相互學(xué)習(xí)進(jìn)步 ~
目錄
- 🏝? 博主介紹
- 1. 概述 🚀
- 2. 數(shù)據(jù)模型與存儲(chǔ) 🚀
- 3. MongoDB 常用命令 🚀
- 4. MongoDB 索引 🚀
- 5. MongoDB的使用場(chǎng)景 🚀
- 6. SpringBoot 集成 MongoDB 🚀
🌱 在數(shù)據(jù)庫(kù)的世界里,MongoDB和MySQL是兩種非常流行且功能強(qiáng)大的數(shù)據(jù)庫(kù)系統(tǒng),但它們各自的設(shè)計(jì)哲學(xué)、應(yīng)用場(chǎng)景以及數(shù)據(jù)模型存在顯著差異。對(duì)于數(shù)據(jù)庫(kù)初學(xué)者來(lái)說(shuō),了解這些差異有助于更好地選擇適合自己的工具,并深入理解數(shù)據(jù)庫(kù)的基本原理。本文將帶領(lǐng)你踏入MongoDB的世界,并通過(guò)與MySQL的對(duì)比,幫助你快速上手MongoDB。🍂
1. 概述 🚀
- ? MongoDB :MongoDB是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源NoSQL數(shù)據(jù)庫(kù)系統(tǒng),由C++編寫(xiě)而成。與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不同,MongoDB采用了面向文檔的存儲(chǔ)方式,支持“無(wú)模式”的數(shù)據(jù)建模,能夠存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類(lèi)型。這使得MongoDB在處理半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)時(shí),表現(xiàn)得尤為出色,如日志、社交媒體數(shù)據(jù)等。MongoDB屬于NoSQL(Not Only SQL)數(shù)據(jù)庫(kù)的一種。它采用鍵值存儲(chǔ)的方式來(lái)存儲(chǔ)數(shù)據(jù),是一種類(lèi)似于JSON 的 格式叫BSON(Binary JSON),雖然我們平時(shí)看到的文檔都是JSON格式呈現(xiàn),但在內(nèi)部是以BSON格式存儲(chǔ)的。MongoDB特別適合處理大規(guī)模數(shù)據(jù)集、高并發(fā)讀寫(xiě)、以及需要靈活數(shù)據(jù)模型的應(yīng)用場(chǎng)景。
- ? MySQL:MySQL是一個(gè)流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),使用標(biāo)準(zhǔn)的SQL語(yǔ)言來(lái)管理數(shù)據(jù)。它遵循ACID(原子性、一致性、隔離性、持久性)原則,適合需要事務(wù)處理、強(qiáng)一致性保證和復(fù)雜查詢的應(yīng)用場(chǎng)景。
2. 數(shù)據(jù)模型與存儲(chǔ) 🚀
? MongoDB的數(shù)據(jù)模型:
- ? 數(shù)據(jù)庫(kù)(Database):包含多個(gè)集合,類(lèi)似于關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)。
- ? 集合(Collection):集合是文檔的集合,相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的表,但不需要定義結(jié)構(gòu)。
- ? 文檔(Document):MongoDB的基本單位是文檔,文檔是JSON格式的鍵值對(duì)集合,其內(nèi)部格式為BSON。一個(gè)文檔可以嵌套其他文檔或數(shù)組,非常靈活。
? MySQL的數(shù)據(jù)模型:
- ? 數(shù)據(jù)庫(kù)(Database):數(shù)據(jù)庫(kù)是表的容器,提供了命名空間、訪問(wèn)控制和數(shù)據(jù)完整性的機(jī)制
- ? 表(Table):由行和列組成的二維數(shù)據(jù)結(jié)構(gòu),每列都有固定的數(shù)據(jù)類(lèi)型和約束。
- ? 行(Row):表中的一條記錄。
- ? 列(Column):表中的字段,定義了數(shù)據(jù)的類(lèi)型和屬性。
3. MongoDB 常用命令 🚀
- ? 啟動(dòng)MongoDB:首先進(jìn)入MongoDB目錄下創(chuàng)建
data/db
文件夾,然后進(jìn)入bin目錄下面,執(zhí)行mongod --dbpath=../data/db
- ? 連接MongoDB:進(jìn)入MongoDB的bin目錄下執(zhí)行
mongo --host=localhost --port=27017
- ? 創(chuàng)建數(shù)據(jù)庫(kù):
use 數(shù)據(jù)庫(kù)
示例:use mydb。如果mydb不存在則創(chuàng)建它,存在則進(jìn)入該數(shù)據(jù)庫(kù)
- ? 刪除數(shù)據(jù)庫(kù):
db.dropDatabase()
- ? 查看當(dāng)前數(shù)據(jù)庫(kù):
db
- ? 查看所有數(shù)據(jù)庫(kù):
show dbs
- ? 創(chuàng)建集合:
db.createCollection("集合")
示例:db.createCollection(“mycollection”)
- ? 刪除集合:
db.集合.drop()
示例:db.mycollection.drop()
- ? 插入文檔(單個(gè)):
db.集合.insert(json數(shù)據(jù))
示例:db.collection_08.insert({“name”:“小張”,“age”:18})
- ? 插入文檔(多個(gè)):
db集合.insertMany([json數(shù)據(jù)])
||db集合.insert([json數(shù)據(jù)])
示例:db.collection_08.insertMany([{“name”:“小張”,“age”:18},{“name”:“小張”,“age”:18,“hight”:“178cm”}])
- ? 查詢文檔:
db.集合.find()
(示例:db.collection_08.find()
) - ? 查詢指定字段:
db.集合名.find({}, {"鍵名1": 1, "鍵名2": 0})
(1表示顯示該字段,0表示不顯示) - ? 條件查詢:
等于:
db.集合名.find({"鍵名": "值"})
不等于:
db.集合名.find({ "鍵名": { "$ne": "值" }})
AND條件:
db.集合名.find({"鍵名1": "值1", "鍵名2": "值2"})
OR條件:
db.集合名.find({"$or": [{"鍵名1": "值1"}, {"鍵名2": "值2"}]})
比較條件(大于、小于等):
db.集合名.find({"鍵名": {"$gt": 值}})
,其中$gt
表示大于,$lt
表示小于,$gte
表示大于等于,$lte
表示小于等于IN條件:
db.集合名.find({"鍵名": {"$in": ["值1", "值2"]}})
NOT IN條件:
db.集合名.find({"鍵名": {"$nin": ["值1", "值2"]}})
模糊匹配(包含):
db.集合名.find({"字段名": /值/})
正則表達(dá)式匹配(以某個(gè)值開(kāi)頭/結(jié)尾):
db.集合名.find({"字段名": /^值/})
或db.集合名.find({"字段名": /值$/})
- ? 刪除所有文檔:
db.集合名.remove({})
- ? 刪除匹配條件的文檔:
db.集合名.remove({"鍵名": "值"})
- ? 更新匹配到的第一條文檔:
db.集合名.updateOne({查詢條件}, {$set: {更新內(nèi)容}})
- ? 更新匹配到的所有文檔:
db.集合名.updateMany({查詢條件}, {$set: {更新內(nèi)容}})
- ? 統(tǒng)計(jì):
db.集合名.count()
||db.集合名.count({查詢條件})
- ? 排序:
db.集合名.find().sort({"鍵名": 1})
(1為升序,-1為降序) - ? 分頁(yè):
db.集合名.find().skip(N).limit(M)
(跳過(guò)N條數(shù)據(jù),限制返回M條數(shù)據(jù))
4. MongoDB 索引 🚀
- ? 創(chuàng)建單一索引:
db.collection.createIndex({ fieldName: 1 })
collection 表示集合名稱(chēng),fieldName 是你想要索引的字段名,1 表示升序索引(-1 表示降序索引)。
- ? 創(chuàng)建復(fù)合索引:
db.collection.createIndex({ fieldName1: 1, fieldName2: -1 })
復(fù)合索引可以基于多個(gè)字段的順序來(lái)優(yōu)化查詢。
- ? 查看索引:
db.collection.getIndexes()
- ? 刪除索引:
db.collection.dropIndex({ fieldName: 1 })
||db.collection.dropIndex(索引名稱(chēng))
- ? 刪除所有索引(除了 _id 索引):
db.collection.dropIndexes()
- ? 索引評(píng)估:
db.collection.find({ fieldName: "value" }).explain()
查詢語(yǔ)句后面加 explain()
下面兩張圖片,第一張是沒(méi)有使用到索引,第二張是使用到了索引。
5. MongoDB的使用場(chǎng)景 🚀
- 大數(shù)據(jù)存儲(chǔ)和處理:MongoDB適用于存儲(chǔ)和處理大量的非結(jié)構(gòu)化數(shù)據(jù),如日志數(shù)據(jù)、社交媒體數(shù)據(jù)、傳感器數(shù)據(jù)等。由于其靈活的文檔模型,MongoDB能夠輕松地處理這些復(fù)雜且多變的數(shù)據(jù)結(jié)構(gòu)。
- 實(shí)時(shí)分析和報(bào)表:MongoDB的數(shù)據(jù)模型和查詢語(yǔ)言(MongoDB Query Language,
MQL)支持復(fù)雜的聚合操作和數(shù)據(jù)分析,適合進(jìn)行實(shí)時(shí)數(shù)據(jù)分析和報(bào)表生成。 - 高并發(fā)讀寫(xiě):MongoDB的異步非阻塞I/O模型和高性能的內(nèi)存映射文件技術(shù),使其能夠應(yīng)對(duì)高并發(fā)的讀寫(xiě)請(qǐng)求,適用于需要處理大量用戶訪問(wèn)和數(shù)據(jù)更新的應(yīng)用場(chǎng)景。
- 內(nèi)容管理系統(tǒng)(CMS):MongoDB可以用作內(nèi)容管理系統(tǒng)的后端數(shù)據(jù)庫(kù),存儲(chǔ)和管理大量的文章、圖片、視頻等內(nèi)容。
- 社交網(wǎng)絡(luò)應(yīng)用:MongoDB的靈活數(shù)據(jù)模型和高性能讀寫(xiě)能力使其成為社交網(wǎng)絡(luò)應(yīng)用的理想選擇,能夠存儲(chǔ)用戶信息、社交關(guān)系、消息等數(shù)據(jù)。
- 物聯(lián)網(wǎng)(IoT)應(yīng)用:MongoDB可以存儲(chǔ)和處理大規(guī)模的物聯(lián)網(wǎng)設(shè)備生成的數(shù)據(jù),如傳感器數(shù)據(jù)、設(shè)備狀態(tài)等,為物聯(lián)網(wǎng)應(yīng)用提供強(qiáng)大的數(shù)據(jù)支持。
6. SpringBoot 集成 MongoDB 🚀
? 源碼地址:SpringBoot 集成 MongoDB
- 引入Maven依賴
<!--父依賴,dependency可以不加依賴版本--><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.2.4.RELEASE</version></parent><dependencies><!-- mongodb --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- spring-boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 單元測(cè)試 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
- 添加yaml配置文件
server:port: 8082spring:data:mongodb:host: localhostdatabase: test_02port: 27017# 也可以直接使用uri連接
# uri: mongodb://localhost:27017/test_02
- 創(chuàng)建實(shí)體類(lèi)
@Data
@Document(collection = "comment")
public class CommentEntity {@Idprivate String id;// 點(diǎn)贊數(shù)@Field("likeNum")private Integer likeNum;// 內(nèi)容private String comment;// 父Idprivate String parentId;
}
- 創(chuàng)建Dao
public interface CommentRepository extends MongoRepository<CommentEntity, String> {/*** 根據(jù)parentId獲取數(shù)據(jù)* @param parentId* @return*/List<CommentEntity> findByParentId(String parentId);}
- 創(chuàng)建Test進(jìn)行測(cè)試
@RunWith(SpringRunner.class)
// 如果不放在swp.basis.service目錄下,必須指定BasisApplication啟動(dòng)類(lèi)
@SpringBootTest(classes = BasisApplication.class)
public class CommentServiceTest {@Autowiredprivate CommentRepository commentRepository;@Testpublic void test(){System.out.println(commentRepository.findAll());System.out.println(commentRepository.findByParentId("66ed29b0bbf12138ee50b657"));}
}