目錄
- 引言
- 第一節:集合的“誕生”——自動出現還是手動打造?🤔
- 第二節:集合的“查閱”——看看這個數據庫里有哪些柜子?📂👀
- 第三節:集合的“重命名”——給文件柜換個名字!??
- 第四節:集合的“銷毀”——丟掉這個文件柜!💥👋
- 第五節:集合與模式 (Schema) 的那些事兒 🤔??📄
- 第六節:總結與展望 (集合篇) 🎉📄
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
其他優質專欄: 【🎇SpringBoot】【🎉多線程】【🎨Redis】【?設計模式專欄(已完結)】…等
如果喜歡作者的講解方式,可以點贊收藏加關注,你的支持就是我的動力
?更多文章請看個人主頁: 碼熔burning
來,各位csdn的佬友們!💻📱 這是一篇專門為你量身定制的,關于如何“馴服”MongoDB 數據庫(而不是里面的數據)的干貨文章!請接收!👇
看之前可以先了解一下MongoDB是什么:【MongoDB篇】萬字帶你初識MongoDB!
引言
各位未來的技術大牛們,你們好!👋 上一篇咱們聊透了 MongoDB 的“房間”——數據庫。現在,咱們的目光轉向房間里那些用來分門別類存放數據的“文件柜”——集合 (Collection)!
了解數據庫操作請看:【MongoDB篇】MongoDB的數據庫操作!
在傳統的關系型數據庫里,你把數據放在“表”里,表有固定的列,每行數據都得按照表的結構來。而在 MongoDB 里,這個概念被“集合”取代了。集合是文檔 (Document) 的容器,它最大的特點是:同一個集合里的文檔,可以有不同的結構! 🤯
想象一下,你的文件柜里不再是整齊劃一的文件夾,而是各種形狀、大小、內容都不一樣的“包裹”(文檔),只要你能把它們塞進同一個柜子(集合)里,就行!📦??📁
這種靈活的設計,讓 MongoDB 在處理多樣化、結構不固定的數據時如魚得水!🚀
那么,對于這些靈活的“文件柜”,我們都能做些什么操作呢?
第一節:集合的“誕生”——自動出現還是手動打造?🤔
就像數據庫一樣,MongoDB 的集合也可以通過兩種方式“誕生”:自動創建 (Implicit Creation) 和 手動創建 (Explicit Creation)。
1. 自動創建 (Implicit Creation) - 懶人模式!😴
這是 MongoDB 最常見的方式!當你第一次向一個不存在的集合中插入文檔時,MongoDB 會自動創建這個集合。
示例:
假設你當前在 mydatabase
數據庫里,并且里面還沒有一個叫 users
的集合。
use mydatabase; // 切換到數據庫
db.users.insertOne({ name: "張三", age: 30 }); // 向 users 集合插入第一個文檔
執行 db.users.insertOne(...)
命令后,MongoDB 會發現 mydatabase
數據庫里還沒有 users
這個集合,于是它會自動為你創建 users
集合,然后再把文檔插入進去。
此時,如果你執行 show collections;
命令,你會看到 users
集合已經出現在列表里了!🎉
優點: 開發速度快,特別是在原型開發或數據結構變動頻繁時,你不需要停下來先定義集合。
缺點: 無法在創建時指定一些高級選項,比如設置固定大小集合 (Capped Collection) 或添加數據驗證規則 (Schema Validation)。
2. 手動創建 (Explicit Creation) - 精心打造模式!📐?
如果你需要在創建集合時指定一些特殊的屬性或行為,比如固定大小、數據驗證規則等,你就需要使用 db.createCollection()
命令來手動創建集合。
db.createCollection(name, options)
name
: 要創建的集合的名稱(字符串)。options
: 一個文檔,用于指定集合的配置選項(可選)。
示例:
db.createCollection("my_logs"); // 創建一個最簡單的集合 my_logs// 創建一個帶選項的集合
db.createCollection("capped_logs", {capped: true, // 設置為固定大小集合size: 1024 * 1024 * 100 // 設置集合大小上限為 100MB (字節)
});// 創建一個帶數據驗證規則的集合
db.createCollection("strict_users", {validator: { // 驗證規則$jsonSchema: { // 使用 JSON Schema 標準定義驗證規則bsonType: "object", // 文檔必須是對象類型required: ["name", "age", "email"], // 必須包含 name, age, email 字段properties: { // 定義字段的規則name: {bsonType: "string",description: "must be a string and is required"},age: {bsonType: "int", // 年齡必須是整數minimum: 0, // 最小值為 0description: "must be an integer >= 0 and is required"},email: {bsonType: "string",pattern: "^.+@.+\\..+$", // 郵箱格式驗證description: "must be a string and match the email pattern and is required"},// 其他可選字段...status: {enum: ["active", "inactive", "pending"], // status 字段的值必須是列表中的一個description: "can only be one of the enum values"}}}},validationLevel: "strict", // 驗證級別: "strict" (默認) 或 "moderate"validationAction: "error" // 驗證失敗時的動作: "error" (默認) 或 "warn"
});
createCollection
命令的常用選項詳解:
capped: <boolean>
:設置為true
創建一個固定大小集合 (Capped Collection)。固定大小集合有以下特點:- 高性能寫入:寫入速度非常快,因為它只是在集合末尾追加數據。
- 插入順序保留:文檔始終按照插入順序存儲和讀取。
- 達到上限時自動覆蓋:當集合達到
size
或max
指定的上限時,最老的文檔會被新的文檔自動覆蓋,就像一個循環緩沖區!🔄 - 不支持刪除或更新導致的文檔大小增加:通常用于存儲日志、緩存、消息隊列等需要快速寫入、按時間排序且會自動清理舊數據的場景。
size: <number>
:指定固定大小集合的最大容量(以字節為單位)。必須與capped: true
一起使用。max: <number>
:指定固定大小集合的最大文檔數量。可選,與capped: true
和size
一起使用。如果同時指定了size
和max
,則哪個先達到,集合就達到上限。validator: <document>
:指定集合的數據驗證規則 (Schema Validation)。這是一個強大的功能,讓你在 MongoDB 的靈活模式基礎上,依然能對文檔結構和內容進行一定程度的約束!你可以使用 JSON Schema 標準或者 MongoDB 特定的驗證表達式來定義規則。- 驗證規則定義在一個文檔中。
$jsonSchema
是最推薦的方式,因為它基于標準,易于理解和維護。- 你可以定義字段的類型 (
bsonType
)、必填字段 (required
)、字段的屬性規則 (properties
),甚至更復雜的邏輯。
validationLevel: <string>
:驗證級別,控制驗證規則在什么時候執行:strict
(默認):對所有的插入和更新操作都應用驗證規則。moderate
:只對現有的有效文檔應用驗證規則,對于插入操作和對無效文檔的更新才應用驗證規則。對于更新操作,如果更新會導致文檔從有效變為無效,也會應用驗證規則。
validationAction: <string>
:驗證失敗時的動作:error
(默認):驗證失敗時,拒絕插入或更新操作,并拋出錯誤。warn
:驗證失敗時,記錄警告日志,但仍然允許插入或更新操作。
collation: <document>
:指定集合的排序規則 (Collation)。這對于進行字符串比較操作(比如排序、字符串相等比較、范圍查詢、聚合中的分組等)非常重要,特別是當你處理非英文字符(比如中文)時。可以指定語言、大小寫敏感性、重音敏感性等。storageEngine: <document>
:指定集合使用的存儲引擎的特定選項。通常你不需要在這里指定,除非你有特殊的存儲引擎配置需求。MongoDB 默認使用 WiredTiger 存儲引擎。
通過 createCollection
命令并配合這些選項,你可以根據不同的業務場景,創建出滿足特定需求的“文件柜”!🎯
注意: 手動創建的空集合也會立即出現在 show collections;
列表中!不像自動創建那樣需要先有數據。
第二節:集合的“查閱”——看看這個數據庫里有哪些柜子?📂👀
想知道你當前所在的數據庫里有哪些集合?很簡單!
使用 show collections;
命令。
use mydatabase; // 切換到數據庫
show collections;
執行這個命令后,你會看到當前數據庫中所有集合的名稱列表。
注意: 這個命令只會列出當前數據庫中的集合,不會列出其他數據庫的集合。它就像是打開了當前房間的門,看看里面有哪些文件柜,而不會去隔壁房間看。🚪👀
第三節:集合的“重命名”——給文件柜換個名字!??
文件柜名字起得不好?想換個更貼切的名字?沒問題!你可以重命名一個集合。
使用 db.collection_name.renameCollection("new_name")
命令。
use mydatabase; // 切換到集合所在的數據庫
db.myoldcollection.renameCollection("mynewcollection"); // 將 myoldcollection 改名為 mynewcollection
db.myoldcollection
: 指定要重命名的集合對象。renameCollection("mynewcollection")
: 調用renameCollection
方法,并傳入新的集合名稱。
注意: 重命名操作是原子性的,它會一次性完成。重命名后,原集合名稱就不能再使用了。
第四節:集合的“銷毀”——丟掉這個文件柜!💥👋
如果某個集合的數據已經不再需要,或者整個文件柜都要扔掉,你可以刪除(銷毀)一個集合。
警告: 刪除集合是一個非常危險的操作! 一旦刪除,該集合中的所有文檔都將永久丟失!不可恢復! 在執行這個操作之前,請務必再三確認,并在生產環境謹慎至極,最好先進行備份!💣💾
刪除集合的命令是 db.collection_name.drop()
。
-
首先,你需要切換到包含要刪除集合的數據庫。
-
然后,指定要刪除的集合名稱,并調用
drop()
方法。use mydatabase; // 切換到數據庫 db.mycollection.drop(); // 刪除名為 mycollection 的集合
執行這個命令后,MongoDB 會返回一個結果,告訴你操作是否成功。通常你會看到 true
或者一個包含成功信息的文檔。
再運行 show collections;
,你會發現剛才刪除的集合已經不見了!💨
重要注意事項:
drop()
方法總是刪除你調用它的那個集合對象。確保你調用的是正確的集合!- 刪除集合的操作也需要足夠的權限,通常需要該集合所在數據庫的
dropCollection
或dbAdmin
等角色權限。
第五節:集合與模式 (Schema) 的那些事兒 🤔??📄
前面我們一直強調,MongoDB 的集合是“模式靈活”的,同一個集合里的文檔可以有不同的結構。這是它與關系型數據庫“表”的最大區別之一。
這種靈活性帶來了巨大的開發便利性,特別是在數據結構不穩定或多樣化的場景。但同時,它也帶來了一些挑戰:
- Schema on Read vs Schema on Write: 傳統關系型數據庫是“Schema on Write”,你在寫入數據前就定義好模式,寫入時強制遵守。MongoDB 則是“Schema on Read”,它不強制寫入時的模式(除非你使用了驗證規則),而是在讀取數據時由應用程序去理解和處理不同的文檔結構。這意味著你的應用程序代碼需要更靈活地處理可能存在的字段缺失或類型不匹配問題。
- 數據一致性: 如果沒有驗證規則,同一個字段在不同文檔中可能有不同的數據類型(比如,某個文檔的
age
是數字,另一個是字符串),這可能導致查詢或聚合操作出現意外結果。
這就是為什么 MongoDB 引入了數據驗證 (Schema Validation) 這個功能!通過在集合層面定義驗證規則,你可以在享受模式靈活帶來的便利的同時,也能保證關鍵數據的結構和類型符合預期,提高數據質量和一致性!?
選擇是否使用以及使用多嚴格的驗證規則,取決于你的業務需求和對數據一致性的要求。
第六節:總結與展望 (集合篇) 🎉📄
太棒了!關于 MongoDB 的“文件柜”——集合,我們已經從它的“出生”聊到了“死亡”,還深入了解了它靈活的模式以及如何通過驗證規則進行約束!
核心要點回顧:
- 集合是文檔的容器,模式靈活。
- 創建可以是自動(第一次寫入數據時)或手動(
createCollection
)。 createCollection
可以指定固定大小 (capped)、數據驗證 (validator)、排序規則 (collation) 等選項。- 查看集合使用
show collections;
。 - 重命名集合使用
db.collection.renameCollection();
。 - 刪除集合使用
db.collection.drop();
,危險! - 集合的模式靈活帶來便利和挑戰,數據驗證是平衡兩者的方式。
現在,我們已經掌握了如何在 MongoDB 這個“倉庫”中劃分“房間”(數據庫),以及如何在房間里設置“文件柜”(集合)。接下來,就該看看文件柜里那些最最核心的“文件”——文檔 (Document) 了!那可是真正的數據載體!📄
關注作者不迷路,下篇文章會講解。