double类型占几个字节_MongoDB 中的数据类型
1 JSON 與 BSON
MongoDB 是文檔數據庫,什么是文檔呢?如果你看了之前的文章相信你已經有些概念了,這里的文檔不是指 Word、PDF 這樣的文檔,而是類似 JSON(JavaScript Object Notation) 的對象,由不同的鍵以及對應的值組成,它的名字是 BSON(Bin-ary JSON)。
BSON 可以理解為 JSON 的擴展,我們先來認識下后者。JSON 是一種輕量的數據交換格式,常用于進程間通信、API 返回結果等方面。看個例子
{????"name":?"xiaoming",
????"age":?18,
????"is_student":?true,
????"favorites":?["basketball",?"sing"],
????"extra":?{
????????"height":?180,
????????"country":?"china"
????}
}
這就是一個 JSON 串,有如下特征
- 以文本形式存儲
- 支持的簡單類數據型:有字符串、數字、布爾值
- 支持的復合數據類型有:數組、對象
- 支持的特殊數據類型有:null
- JSON 的最外層是一個數組或者對象
對于復合類型我做一些說明:
數組,由 0 到多個元素組成,多個中間以逗號隔開,外層使用方括號([])進行包裹,比如 favorites 字段對應的值就是一個數組。數組里面的元素可以是簡單類型或者復合類型的一種或多種,也就是說不要求數組里的類型都相同。
對象,由 0 到多個鍵值對組成,多個中間以逗號隔開,外層使用花括號({})進行包裹,比如 extra 字段對應的值就是一個對象。其中的鍵只能是字符串,值可以是簡單類型或者復合類型。這個例子中 JSON 的最外層也是一個對象。
JSON 輕量、易讀,這是它的優勢,不過也有些缺陷
- 支持的類型不是很精確,比如數字,我們無法判定是整型還是浮點型,如果根據有沒有小數點來區分,即使判定是整型了,它是 32 位的還是 64 位的我們也無從得知
- 支持的類型不是很全,比如常用的時間類型沒有
這樣一來就引入了 BSON,它做了如下擴充
- 數字支持更準確的類型,對于整型有 int32、int64 等,對于小數有 double、decimal128
- 引入了 Timestamp、UTC datetime 等其它類型
需要注意的是,BSON 是以二進制形式存儲的,所以可讀性不高。另外,它的最外層只能是對象。
PS:如果比較好奇 JSON 和 BSON 的規范,可以看下文末的參考鏈接 1 和 2
2 MongoDB 中常見的數據類型
官方文檔 BSON Types 一節(見參考鏈接 3)中對支持的數據類型列了一個表,我按自己的理解給大家梳理下。
JSON 支持的數據類型,BSON 肯定也支持,所以先用 JSON 去理解其中一部分數據類型
| 簡單類型 | 數字 | - |
| 布爾 | Boolean | |
| 字符串 | String | |
| 復合類型 | 數組 | Array |
| 對象 | Object | |
| 特殊類型 | null | Null |
BSON 對數字進行了一些擴充,我們記住常見的幾個就行
- 32-bit integer(32 位整數)
- 64-bit integer(64 位整數)
- Double(浮點數)
- Decimal128(小數)
Double 和 Decimal128 有什么差別呢?你可以簡單理解為后一種更加準確,前者存儲的是一個大概值,后者則是存儲一個準確值。比如,同樣是 9.99,Decimal128 存儲的是準確的,Double 則是存的 9.9900000000000002131628...。一般情況我們使用 Double 沒有什么問題,但是在某些對數字準確度有較大要求的場景下就要使用 Decimal128,比如電商、金融行業等。另外,它們所占的存儲空間也是不同的,前者是 8 個字節,后者是 16 個字節。
BSON 還擴充了一些類型,我們也挑幾個常用的認識下
- ObjectID
該類型主要用于文檔唯一 _id 的生成,長度為 12 個字節
-?前?4?個字節記錄的是時間戳-?中間?5?個字節是隨機數
-?后?3?個字節是計數器
MongoDB 3.2 以及之前的版本對于中間 5 個字節的生成策略有些不同:前 3 個是機器 ID,后 2 個是進程 ID。3.2 之后的版本使用的是隨機數。
注意:本文在對字節進行前后描述時,前指的是高字節位,后指的低字節位
- Timestamp
該類型主要用在 MongoDB 程序內部,用于標識操作的先后順序,長度為 8 個字節
-?前?4?個字節記錄的是時間戳-?后?4?個字節記錄的是在同一秒內某個操作的序號,這個序號是遞增的,由于同一秒內經常會有多個操作,所以采用這種方式記錄
- Date
應用如果要用到時間類型的話,一般會使用這個數據類型,它的底層其實是一個 64 位的整數,記錄的也是時間戳,不過單位是毫秒。
另外說明下,如果你看過 BSON 的規格描述,你會發現 MongoDB 中對于一些類型的命名和 BSON 有些差異。比如,MongoDB 官方文檔中 Object 其實和 BSON 中的 document 是同一種數據類型,只是名字不同。我們不用過于糾結這些,只要記住一種命名,比如 MongoDB 官方文檔中的,然后知道它代表著什么或者是怎么存的就行了。
如果需要比較全面的了解 MongoDB 中支持的數據類型,請查閱官方文檔 BSON Types 一節(參考鏈接 3)。
3 使用 Compass 查看數據類型
我們打開 Compass,在集合 video.movies 的詳情頁面,打開 Schema 標簽頁,點擊 ANALYZE 按鈕后等待一小會后,我們可以看到文檔中各字段值的數據類型
列下部分字段的數據類型
- _id:ObjectId
- cast:3 種數據類型,有 Array、String 和 Undefined。由于 MongoDB 不會對某個字段的類型做強制要求,也就出現了不同文檔同一個字段類型不同的情況。Undefined 表示 cast 字段在某些文檔中是不存在的
- viewerRating:3 種數據類型,有 Double、32-bit integer 和 Undefined
PS:這個小節中,集合的類型信息我都沒有列完,大家可以自己使用 Compass 看下,再看下其它集合的一些信息,然后對照前面的介紹熟悉一些常用的數據類型。
需要注意的是,上面的數據類型信息都是取樣統計的(一般是取 1000 條,具體信息可以看查詢框下的提示信息,比如上圖樣本量為 1000,總文檔量為 963534,比例大概是 0.1%),并非統計的集合中的所有文檔,所以不能百分百的保證全面。不過一般情況下這也夠了,因為同一個集合中的文檔字段大部分是相同的,即使有差異,取樣的時候大概率也能取到,所以統計結果還是十分接近于真實情況的。
再看下集合 citibike.trips
也列下部分字段的數據類型
- end station location:Object,其中子文檔又有 2 個字段
- coordinates:2 種數據類型,有 Array 和 Double
- type:String
- stop time:Date
字段 end station location 有點特殊,它的內容類似這樣
"end?station?location":?{????"type":?"Point",
????"coordinates":?[-73.99973337,?40.71910537]
}
在 MongoDB 中可以以這種方式存儲地理位置信息,type 指地理位置類型,coordinates 則指具體的坐標,這個對象在 MongoDB 中有個名字 GeoJSON object,可以理解為 MongoDB 基于 Object 類型擴展出的新的類型,但這個類型并非 BSON 規范所有。
在 Compass 中我們可以啟用地理信息可視化的設置,依次點擊菜單項 Help -> Privacy Settings,會有彈窗
勾選設置 Enable Geographic Visualizations 后,點擊 Close 關閉彈窗,最后點擊下 ANALYZE 重新生成統計信息
可以看到,Compass 對取樣的文檔中的地理位置進行了可視化。細心的伙伴可能會注意到,字段 end station location 下方展示的類型也從 document 變成了 coordinates,和前面 MongoDB 中的數據類型命名和 BSON 不一致一樣,我們不用太糾結命名,知道 coordinates 指的是 GeoJSON object 就行了。
4 小結
本文簡單介紹了 BSON,然后介紹了 MongoDB 中常用的 BSON 數據類型,最后借助 Compass 工具對這些類型進行了熟悉。
5 參考
總結
以上是生活随笔為你收集整理的double类型占几个字节_MongoDB 中的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xp打印服务器win10的系统连接不上,
- 下一篇: matplotlib调节colorbar