MongoDb入門
MongoDB 不是關聯式資料庫,而是面向文件(document-oriented)的資料庫。
MongoDB 的設計採用了橫向擴充套件。面向文件的資料模型使跨多臺伺服器拆分資料更加容易。MongoDB 會自動平衡跨叢集的資料和負載,自動重新分配文件,並將讀寫操作路由到正確的機器上
文件
文件是 MongoDB 的核心概念:它是一組有序鍵值的集合。文件的表示形式因程式語言而異,但大多數語言具有自然匹配的資料結構,比如對映、雜湊表或字典。
{"greeting" : "Hello, world!"}
文件中的值不僅僅是“二進位制大物件”,它們可以是幾種不同的資料型別之一
文件中的鍵是字串型別,會區分型別和大小寫,文件不能包含重複的鍵
集合
集合就是一組文件。如果將文件比作關聯式資料庫中的行,那麼一個集合就相當於一張表。
動態模式
集合具有動態模式的特性。這意味著一個集合中的文件可以具有任意數量的不同“形狀”。
例如,以下兩個文件可以儲存在同一個集合中:
{"greeting" : "Hello, world!", "views": 3}
{"signoff": "Good night, and good luck"}
命名
集合由其名稱進行標識。集合名稱可以是任意 UTF-8 字串,但有以下限制。
- 集合名稱不能是空字串("")。
- 集合名稱不能含有 \0(空字元),因為這個字元用於表示一個集合名稱的結束。
- 集合名稱不能以 system. 開頭
子集合
使用 . 字元分隔不同名稱空間的子集合是一種組織集合的慣例
例如,有一個具有部落格功能的應用程式,可能包含名為 blog.posts 和名為 blog.authors 的集合。
資料庫
MongoDB 使用集合對文件進行分組,使用資料庫對集合進行分組
插入文件
insertMany
如果要向一個集合中插入多個文件,那麼可以使用 insertMany。
在當前版本中,MongoDB 能夠接受的最大訊息長度是 48MB,因此在單次批次插入中能夠插入的文件是有限制的。如果嘗試插入超過 48MB 的資料,則多數驅動程式會將這個批次插入請求拆分為多個 48MB 的批次插入請求。詳情請檢視所使用驅動程式的相關文件。
在使用 insertMany 執行批次插入時,如果中途某個文件發生了某種型別的錯誤,那麼接下來會發生什麼取決於所選擇的是有序操作還是無序操作。可以指定一個選項文件作為insertMany 的第二個引數。將選項文件中的 "ordered" 鍵指定為 true,可以確保文件按提供的順序插入。指定為 false 則允許 MongoDB 重新排列插入的順序以提高效能。如果未特別指定,則預設為有序插入。對於有序插入,插入順序由傳遞給 insertMany 的陣列進行定義。如果一個文件產生了插入錯誤,則陣列中在此之後的文件均不會被插入集合中。對於無序插入,MongoDB 將嘗試插入所有文件,而不管某些插入是否產生了錯誤。
插入校驗
MongoDB 會對要插入的資料進行最基本的檢查:檢查文件的基本結構,如果不存在 "_id"欄位,則自動新增一個。其中一項最基本的結構檢查就是文件大小:所有文件都必須小於16MB。這是一個人為設定的限制(將來可能會提高),主要是為了防止不良的模式設計並確保效能上的一致。要檢視 doc 文件的二進位制 JSON(BSON)大小(以位元組為單位),可以在 shell 中執行 Object.bsonsize(doc)。
刪除文件
CRUD API 為此提供了 deleteOne 和 deleteMany 兩種方法。這兩種方法都將篩選文件(filter document)作為第一個引數。
更新文件
將文件存入資料庫中之後,可以使用以下幾種更新方法之一對其進行更改:updateOne、updateMany 和 replaceOne。updateOne 和 updateMany 都將篩選文件作為第一個引數,將變更文件作為第二個引數,後者對要進行的更改進行描述。replaceOne 同樣將篩選文件作為第一個引數,但第二個引數是一個用來替換所匹配的篩選文件的新文件。
更新文件是原子操作:如果兩個更新同時發生,那麼首先到達伺服器的更新會先被執行,然後再執行下一個更新。因此,相互衝突的更新可以安全地迅速接連完成,而不會破壞任何文件:最後一次更新將“成功”。如果不想使用預設行為,則可以考慮使用文件版本控制模式
文件替換
replaceOne 會用新文件完全替換匹配的文件。這對於進行大規模模式遷移的場景非常有用。
使用更新運算子
通常文件只會有一部分需要更新。可以使用原子的更新運算子(update operator)更新文件中的特定欄位。更新運算子是特殊的鍵,可用於指定複雜的更新操作,比如更改、新增或刪除鍵,甚至可以運算元組和內嵌文件。
upsert
upsert 是一種特殊型別的更新。如果找不到與篩選條件相匹配的文件,則會以這個條件和更新文件為基礎來建立一個新文件;如果找到了匹配的文件,則進行正常的更新。upsert用起來非常方便,有了它便不再需要“預置”集合:通常可以使用同一套程式碼建立和更新文件。
更新多個文件
到目前為止,本章都是使用 updateOne 來描述更新操作。updateOne 只會更新找到的與篩選條件匹配的第一個文件。如果匹配的文件有多個,它們將不會被更新。要修改與篩選器匹配的所有文件,請使用 updateMany。updateMany 遵循與 updateOne 同樣的語義並接受相同的引數。關鍵的區別在於可能會被更改的文件數量。