概念區分
什么是關系型數據庫
關系型數據庫(Relational Database)是一種基于關系模型的數據庫管理系統(DBMS)。在關系型數據庫中,數據以表格的形式存儲,表格由行和列組成,行表示數據記錄,列表示數據字段。每個表格都有一個唯一的標識符,稱為主鍵,用于唯一標識表中的每一行。
關系型數據庫的核心概念包括:
-
表格(Table):數據以表格的形式組織,每個表格具有名稱和一組定義了數據類型的列。表格表示實體(如人、物、事件等)以及實體之間的關系。
-
行(Row):表格中的每一行代表一個數據記錄,包含了不同字段的數據值。
-
列(Column):表格中的每一列代表一個數據字段,定義了數據的類型和格式。
-
主鍵(Primary Key):每個表格都有一個主鍵,用于唯一標識表中的每一行。主鍵確保數據的唯一性和完整性。
-
外鍵(Foreign Key):外鍵用于在不同表格之間建立關聯,表示表格之間的關系。外鍵通常引用其他表格的主鍵。
-
SQL(Structured Query Language):關系型數據庫使用SQL來進行數據查詢、插入、更新和刪除操作。SQL是一種標準化的查詢語言,用于與關系型數據庫交互。
關系型數據庫的一些常見示例包括:
- MySQL
- PostgreSQL
- Oracle Database
- Microsoft SQL Server
- SQLite
關系型數據庫以其結構化的數據模型和廣泛的應用領域而聞名。它們適用于需要復雜數據關系和豐富查詢的應用,如企業應用、金融系統、人力資源管理等。然而,隨著數據的不斷增長和應用場景的多樣化,出現了許多其他類型的數據庫,如NoSQL數據庫,用于處理非結構化和半結構化數據,而且本文講到的MongoDB就屬于非關系型數據庫,也是改文章的主角。
什么是非關系型數據庫
非關系型數據庫(NoSQL,Not Only SQL)是一類數據庫管理系統(DBMS),與傳統的關系型數據庫相比,它們采用不同的數據模型和存儲機制。非關系型數據庫適用于處理大規模、高度分布式、非結構化或半結構化數據,以及需要更高的可擴展性和靈活性的應用場景。
非關系型數據庫的主要特點包括:
-
數據模型多樣性:非關系型數據庫支持多種數據模型,例如鍵值對、文檔、列族、圖形等,以適應不同類型的數據。
-
分布式架構:許多非關系型數據庫具有分布式架構,可以水平擴展,將數據分布在多臺服務器上,以實現高可用性和更好的性能。
-
靈活的模式:非關系型數據庫通常不需要嚴格的表結構定義,允許在數據存儲過程中動態添加、修改字段,從而適應數據模式的變化。
-
高可擴展性:由于其分布式性質,非關系型數據庫能夠輕松地擴展以處理大量數據和高并發請求。
-
適應大數據:非關系型數據庫通常用于存儲和處理大規模的數據,如社交媒體數據、日志文件、傳感器數據等。
常見的非關系型數據庫類型包括:
-
鍵值存儲(Key-Value Stores):數據以鍵值對的形式存儲,適用于高速讀寫操作,如Redis、Amazon DynamoDB。
-
文檔數據庫(Document Stores):數據以類似JSON或XML格式的文檔存儲,適用于半結構化數據,如MongoDB、Couchbase。
-
列族數據庫(Column Family Stores):數據以列族的形式存儲,適用于大規模分布式數據,如Apache Cassandra、HBase。
-
圖形數據庫(Graph Databases):用于存儲和查詢圖形數據,適用于復雜的數據關系,如Neo4j、Amazon Neptune。
-
時間序列數據庫(Time Series Databases):專門用于存儲時間序列數據,如傳感器數據、日志數據等,如InfluxDB、OpenTSDB。
-
搜索引擎(Search Engines):用于全文搜索和數據分析,如Elasticsearch、Solr。
非關系型數據庫在現代應用開發中變得越來越重要,特別是在大數據、云計算和分布式系統領域,此次之所以介紹MongoDB數據庫,也是由于系統開發需求中要求對于聊天記錄做到保存,鑒于數據量較大,所以考慮到了MongoDB架構。
主角MongoDB介紹
MongoDB是一種開源、面向文檔的非關系型數據庫管理系統(NoSQL DBMS),它以其靈活性、可擴展性和強大的查詢能力而聞名。MongoDB的設計理念是為了滿足現代應用中海量數據、高可用性和復雜數據模型的需求。以下是MongoDB的一些重要特點和概念:
-
文檔數據庫:MongoDB使用文檔(Document)來表示數據,文檔類似于JSON格式的數據結構,可以包含各種類型的數據,如字符串、數字、日期、數組和嵌套文檔等。
-
面向文檔:MongoDB是一種面向文檔的數據庫,每個文檔都有一個唯一的標識符(通常稱為_id),用于唯一標識文檔。
-
高可擴展性:MongoDB支持水平擴展,可以通過分片(Sharding)將數據分布到多臺服務器上,以實現更高的存儲容量和性能。
-
動態模式:MongoDB不需要嚴格的表結構定義,文檔可以自由添加和修改字段,適應數據模式的變化。
-
強大的查詢語言:MongoDB支持豐富的查詢語言,可以進行復雜的查詢操作,包括過濾、排序、投影、聚合等。
-
索引支持:MongoDB支持各種類型的索引,包括單字段索引、復合索引、文本索引、地理空間索引等,以加速查詢操作。
-
復制和高可用性:MongoDB支持數據的復制和自動故障轉移,確保數據的高可用性和冗余。
-
數據存儲:MongoDB將數據存儲在集合(Collection)中,每個集合包含一組文檔。集合類似于關系型數據庫中的表格。
-
適用場景:MongoDB適用于需要存儲和處理半結構化或非結構化數據的場景,如大數據、實時數據分析、內容管理系統、日志記錄和用戶個性化推薦等。
MongoDB安裝介紹
Centos安裝MongoDB
以下是在CentOS上安裝MongoDB的詳細步驟:
- 更新系統:
打開終端,并以root或具有sudo權限的用戶身份登錄,首先更新系統軟件包以確保系統處于最新狀態:
sudo yum update
- 添加MongoDB倉庫:
MongoDB提供了官方的YUM倉庫,可以使用以下步驟將其添加到您的系統中:
sudo vi /etc/yum.repos.d/mongodb-org.repo
在編輯器中,添加以下內容(保存并退出編輯器):
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
- 安裝MongoDB:
使用以下命令安裝MongoDB軟件包:
sudo yum install -y mongodb-org
- 啟動MongoDB服務:
安裝完成后,您可以啟動MongoDB服務,并設置其開機自啟動:
sudo systemctl start mongod
sudo systemctl enable mongod
- 驗證MongoDB是否已正確啟動:
運行以下命令來驗證MongoDB是否已成功啟動:
sudo systemctl status mongod
您應該看到MongoDB服務狀態為"active (running)"。
- 連接到MongoDB Shell:
使用MongoDB Shell與數據庫交互,運行以下命令:
mongo
這將連接到本地MongoDB服務器的Shell。
docker安裝MongoDB
大家知道我的習慣,肯定少不了docker的安裝方式啊
安裝MongoDB并在Docker容器中運行它是一個方便的方式,讓我們詳細介紹一下如何在Docker中安裝和運行MongoDB。
-
安裝Docker:
如果您尚未安裝Docker,請按照以下步驟在您的操作系統上安裝Docker:
- 對于Linux用戶,您可以根據您的發行版選擇適當的安裝方式,通常是使用包管理工具(如
apt
或yum
)來安裝Docker。 - 對于Windows用戶,您可以從Docker官方網站下載并運行安裝程序。
- 對于macOS用戶,您可以從Docker官方網站下載并運行Docker Desktop安裝程序。
- 對于Linux用戶,您可以根據您的發行版選擇適當的安裝方式,通常是使用包管理工具(如
-
拉取MongoDB鏡像:
打開終端(或命令行界面)并執行以下命令,以從Docker Hub拉取MongoDB官方鏡像:
docker pull mongo
-
運行MongoDB容器:
使用以下命令來創建并運行MongoDB容器。這將創建一個名為"my-mongodb"的MongoDB容器,并將其綁定到主機的27017端口。可以根據需要自行調整容器名稱和端口綁定。
docker run --name my-mongodb -p 27017:27017 -d mongo
此命令將以后臺模式運行MongoDB容器。要停止容器,可以使用
docker stop
命令:docker stop my-mongodb
要刪除容器,可以使用
docker rm
命令:docker rm my-mongodb
-
連接到MongoDB容器:
要連接到運行中的MongoDB容器的Mongo shell,可以使用以下命令:
docker exec -it my-mongodb mongo
這將進入Mongo shell,可以在其中執行MongoDB命令。
Win系統安裝MongoDB
要在Windows系統上安裝MongoDB,請按照以下步驟操作:
-
下載MongoDB安裝包:
前往MongoDB官方網站(https://www.mongodb.com/try/download/community-kubernetes-operator)下載最新版本的MongoDB安裝包。確保選擇與您的操作系統相匹配的版本。
-
安裝MongoDB:
雙擊下載的安裝包,按照安裝向導指示完成安裝過程。您可以選擇自定義安裝選項,但對于大多數用戶來說,使用默認選項即可。 -
配置MongoDB環境變量:
將MongoDB的安裝路徑添加到系統的環境變量中,以便在任何目錄下都可以通過命令行訪問MongoDB。將安裝路徑(默認為C:\Program Files\MongoDB\Server<版本號>\bin)添加到您的系統環境變量中的Path變量中。 -
創建數據目錄:
在您選擇的位置上創建一個數據目錄,用于存儲MongoDB的數據文件。例如,您可以在C:\data目錄下創建一個名為db的文件夾。 -
配置MongoDB服務:
打開命令提示符(CMD)或PowerShell,并導航到MongoDB的安裝目錄(例如:C:\Program Files\MongoDB\Server<版本號>\bin)。運行以下命令來啟動MongoDB服務器:
mongod --dbpath <數據目錄路徑>
請將
<數據目錄路徑>
替換為您在第4步中創建的數據目錄的路徑。 -
連接到MongoDB:
打開另一個命令提示符或PowerShell窗口,導航到MongoDB的安裝目錄(例如:C:\Program Files\MongoDB\Server<版本號>\bin)。運行以下命令來連接到MongoDB:
mongo
請注意,如果不按照如上步驟操作,而是直接在安裝目錄執行exe
那就需要再D盤根路徑創建一個/data/db目錄,否則會閃退!!!
MongoDB是默認沒有寫入環境變量的,大家需要自己配置,不再贅述!!!
MongoDB使用介紹
在MongoDB中,建立集合(類似于關系型數據庫中的表)是動態的,因此無需像關系型數據庫那樣顯式地定義表結構。只需插入文檔(類似于關系型數據庫中的記錄),MongoDB將自動創建集合并根據文檔的結構來定義字段。命令執行我們可以使用Navicat工具進行連接
以下是MongoDB中創建集合和插入文檔的語法和示例:
簡單使用
- 創建集合并插入文檔:
// 使用insertOne插入文檔并創建集合
db.collectionName.insertOne({ field1: "value1", field2: "value2", ... })
示例:
db.students.insertOne({ name: "李紅", age: 25, major: "Computer Science" })
db.students.insertOne({ name: "張飛", age: 22, major: "Biology" })
- 查詢集合中的文檔:
// 查詢集合中的所有文檔
db.collectionName.find()// 查詢特定條件的文檔
db.collectionName.find({ field: "value" })
示例:
// 查詢所有學生
db.students.find()// 查詢年齡大于等于 25 歲的學生
db.students.find({ age: { $gte: 25 } })
- 更新文檔:
// 使用updateOne更新單個文檔
db.collectionName.updateOne({ condition }, { $set: { field: "new value" } })// 使用updateMany更新多個文檔
db.collectionName.updateMany({ condition }, { $set: { field: "new value" } })
示例:
// 更新學生的專業
db.students.updateOne({ name: "張飛" }, { $set: { major: "Engineering" } })
- 刪除文檔:
// 使用deleteOne刪除單個文檔
db.collectionName.deleteOne({ condition })// 使用deleteMany刪除多個文檔
db.collectionName.deleteMany({ condition })
示例:
// 刪除專業為"Biology"的學生
db.students.deleteMany({ major: "Biology" })
我們再舉一個例子,假設正在開發一個簡單的博客平臺,可以使用MongoDB來存儲博客帖子和評論。在這個復雜業務的示例中,我們將涵蓋以下方面:
- 創建集合和插入文檔
- 查詢和篩選數據
- 更新文檔
- 使用索引
1. 創建集合和插入文檔:
首先,我們創建一個集合來存儲博客帖子,每個帖子包含標題、內容和發布日期:
// 創建博客集合并插入帖子文檔
db.blogPosts.insertOne({title: "MongoDB的相關介紹 ——IT小輝同學",content: "MongoDB 是一個非關系型數據庫",publishDate: new Date("2023-08-01"),comments: []
})
2. 查詢和篩選數據:
現在,我們查詢博客集合中的帖子并篩選出發布日期在特定范圍內的帖子:
// 查詢發布日期在特定范圍內的帖子
db.blogPosts.find({publishDate: { $gte: new Date("2023-08-01"), $lt: new Date("2023-08-10") }
})
3. 更新文檔:
假設一篇帖子收到了一條新評論,我們可以將評論添加到帖子的評論數組中:
// 更新帖子,添加新評論
db.blogPosts.updateOne({ title: "MongoDB的相關介紹,很有意思奧 ——IT小輝同學" },{$push: {comments: {author: "User123",text: "MongoDB,我們一起學習!",timestamp: new Date()}}}
)
4. 使用索引:
為了提高查詢性能,我們可以創建索引以加速某些查詢操作。例如,為了加速根據標題搜索帖子的查詢,我們可以創建標題字段的索引:
// 創建標題字段的索引
db.blogPosts.createIndex({ title: "text" })
這是一個簡化的示例,展示了如何在MongoDB中處理博客帖子和評論的復雜業務場景。實際業務中可能還需要處理更多情況,如用戶認證、數據驗證、用戶關系等。MongoDB的靈活性和功能可以適應各種復雜的業務需求。
請注意,MongoDB的語法使用了JSON,也就是我們Java常說的對象,因此數據和查詢都是使用JSON的形式。
復雜語法
當您需要進行更復雜的增刪改查操作時,MongoDB提供了豐富的查詢、更新和聚合功能來滿足您的需求。以下是更復雜的示例,涵蓋了多條件查詢、更新和聚合操作:
1. 多條件查詢:
假設您要查詢發布日期在特定范圍內,同時標題包含特定關鍵詞的帖子:
db.blogPosts.find({publishDate: { $gte: new Date("2023-08-01"), $lt: new Date("2023-08-10") },title: { $regex: "MongoDB" }
})
2. 多條件更新:
更新帖子的評論,將指定作者的所有評論中的文本替換為新文本:
db.blogPosts.updateMany({ "comments.author": "User123" },{ $set: { "comments.$[].text": "新文本" } }
)
3. 使用聚合:
聚合操作允許您進行數據處理和轉換。假設您要計算每篇帖子的評論數量并按評論數量降序排序:
db.blogPosts.aggregate([{$project: {title: 1,numberOfComments: { $size: "$comments" }}},{$sort: { numberOfComments: -1 }}
])
以上代碼使用聚合管道,首先通過$project
將每篇帖子的標題和評論數量提取出來,然后通過$sort
按評論數量降序排序。
4. 刪除多個文檔:
假設您要刪除評論數低于指定值的所有帖子:
db.blogPosts.deleteMany({comments: { $size: { $lt: 5 } }
})
這將刪除所有評論數少于5條的帖子。