日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

double类型占几个字节_MongoDB 中的数据类型

發布時間:2024/7/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 去理解其中一部分數據類型

JSON 中的數據類型MongoDB 中的數據類型
簡單類型數字-
布爾Boolean
字符串String
復合類型數組Array
對象Object
特殊類型nullNull

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 參考

  • http://bsonspec.org/spec.html
  • https://www.json.org/json-en.html
  • https://docs.mongodb.com/manual/reference/bson-types
  • 總結

    以上是生活随笔為你收集整理的double类型占几个字节_MongoDB 中的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。