MongoDB(5)- Document 文件相關

小菠蘿測試筆記發表於2021-05-31
  • 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。

 

相關文章