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。