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 開始,允許存儲包含 . 和 $ 符號的字段
字段的一些限制
- 鍵名區分大小寫;
- 鍵的值區分類型(如字符串和整數等)
栗子一
以下兩組文檔是不同的,因為值的類型不同
{"recommend":"5"}
{"recommend":5}
栗子二
以下兩組文檔也是不同的,因為鍵名是區分大小寫的
{ "Recommend" : " 5 "}
{"recommend":"5"}
關於一個文檔里面的同名字段
- 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。
