MongoDB(5)- Document 文檔相關
- 2021 年 5 月 31 日
- 筆記
- mongo, 測試高級進階技能系列 - MongoDB
Documents
- MongoDB 的文檔可以理解為關係型資料庫(Mysql)的一行記錄
- MongoDB 將數據記錄為 BSON 格式的文檔
- BSON 是 JSON 文檔的二進位表示,但它支援的數據類型更加豐富(下一篇文章講到)
Documents 的結構
由鍵值對組隊(欄位名:值)
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
欄位的值可以是任何 BSON 數據類型,比如:其他文檔、數組、文檔數組
小栗子
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : NumberLong(1250000) }
上述文檔包含了以下數據類型
_id:
ObjectId(下一篇介紹)name:文檔類型的值,它又包含了 first、last 兩個欄位值
birth、
death
: Date 類型的值contribs:字元串數組
views:NumberLong 類型的值
欄位名
首先必須是字元串,除此之外還有以下限制
欄位名不能包含 null 字元
欄位名為_id
- 保留用作主鍵
- 它的值在集合中必須是唯一的,是不可變的
- 並且可以是數組以外的任何類型
最高一級的欄位名不能包含 $ 字元
不過,從 MongoDB 3.6 開始,允許存儲包含 . 和 $ 符號的欄位
關於一個文檔裡面的同名欄位
- BSON文檔可能有多個同名欄位
- 但是大多數 MongoDB 介面用不支援重複欄位名的結構(例如哈希表)表示MongoDB
- 如果需要操作具有多個同名欄位的文檔,需要查看 driver 驅動相關的文檔(後續介紹)
- 一些由內部 MongoDB 進程創建的文檔可能有重複的欄位,但是沒有 MongoDB 進程會將重複的欄位添加到現有的用戶文檔中
訪問文檔
跟訪問 python 的字典一樣,都是 .
訪問文檔裡面的數組
"<array>.<index>"
數組小栗子
假設有一個文檔,想取 contribs 欄位的第三個值
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
正確做法
contribs.2
更多查詢數組欄位的方法後面展開詳解
訪問文檔裡面的嵌套文檔
"<embedded document>.<field>"
嵌套文檔小栗子
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
正確做法
name.last
contact.phone.type
更多嵌套查詢的方法後面展開詳解
欄位值的限制
對索引欄位的最大長度有限制(後面更新文章再更新這裡)
文檔的限制
文檔大小限制
- 最大 BSON 文檔大小為 16 mb
- 最大文檔大小有助於確保單個文檔不能使用過多的記憶體,或者在傳輸過程中不能佔用過多頻寬
- 為了超過最大大小限制的文檔,MongoDB 也提供了 GridFS(後續再講)
文檔欄位順序
默認情況下,MongoDB 在寫操作後保留文檔欄位的順序,但以下情況除外
- _id 欄位永遠都是第一個欄位
- 重命名欄位名的更新可能會導致文檔中欄位的重新排序
_id 欄位
- 在 MongoDB 中,存儲在集合中的每個文檔都需要一個唯一的 _id 欄位作為主鍵
- 如果新插入的文檔沒有指定 _id 欄位,那麼 MongoDB 會自動為它生成一個 ObjectID(上面的截圖其實也能看到)
- 第二條同樣適用通過 upsert:true 的更新操作(後續再講)
存儲 _id 值的常用選項
- 使用 ObjectId
- 使用自然唯一標識符(如果可用),這樣可以節省空間並避免額外的索引
- 生成一個自動遞增的數字
- 在應用程式程式碼中生成 UUID,為了更有效地存儲集合和索引中的UUID值,將 UUID 存儲為 BSON BinData類型的值
- 如果滿足以下條件,則 BinData 類型的索引鍵將更有效地存儲在索引中:
- 二進位子類型值在0-7或128-135之間,並且
- 位元組數組的長度為:0、1、2、3、4、5、6、7、8、10、12、14、16、20、24或32。
- 使用驅動程式的BSON UUID工具生成UUID。