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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/7/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 double类型占几个字节_MongoDB 中的数据类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 JSON 與 BSON

MongoDB 是文檔數(shù)據(jù)庫,什么是文檔呢?如果你看了之前的文章相信你已經(jīng)有些概念了,這里的文檔不是指 Word、PDF 這樣的文檔,而是類似 JSON(JavaScript Object Notation) 的對象,由不同的鍵以及對應(yīng)的值組成,它的名字是 BSON(Bin-ary JSON)。

BSON 可以理解為 JSON 的擴(kuò)展,我們先來認(rèn)識下后者。JSON 是一種輕量的數(shù)據(jù)交換格式,常用于進(jìn)程間通信、API 返回結(jié)果等方面。看個例子

{
????"name":?"xiaoming",
????"age":?18,
????"is_student":?true,
????"favorites":?["basketball",?"sing"],
????"extra":?{
????????"height":?180,
????????"country":?"china"
????}
}

這就是一個 JSON 串,有如下特征

  • 以文本形式存儲
  • 支持的簡單類數(shù)據(jù)型:有字符串、數(shù)字、布爾值
  • 支持的復(fù)合數(shù)據(jù)類型有:數(shù)組、對象
  • 支持的特殊數(shù)據(jù)類型有:null
  • JSON 的最外層是一個數(shù)組或者對象

對于復(fù)合類型我做一些說明:

數(shù)組,由 0 到多個元素組成,多個中間以逗號隔開,外層使用方括號([])進(jìn)行包裹,比如 favorites 字段對應(yīng)的值就是一個數(shù)組。數(shù)組里面的元素可以是簡單類型或者復(fù)合類型的一種或多種,也就是說不要求數(shù)組里的類型都相同。

對象,由 0 到多個鍵值對組成,多個中間以逗號隔開,外層使用花括號({})進(jìn)行包裹,比如 extra 字段對應(yīng)的值就是一個對象。其中的鍵只能是字符串,值可以是簡單類型或者復(fù)合類型。這個例子中 JSON 的最外層也是一個對象。

JSON 輕量、易讀,這是它的優(yōu)勢,不過也有些缺陷

  • 支持的類型不是很精確,比如數(shù)字,我們無法判定是整型還是浮點(diǎn)型,如果根據(jù)有沒有小數(shù)點(diǎn)來區(qū)分,即使判定是整型了,它是 32 位的還是 64 位的我們也無從得知
  • 支持的類型不是很全,比如常用的時間類型沒有

這樣一來就引入了 BSON,它做了如下擴(kuò)充

  • 數(shù)字支持更準(zhǔn)確的類型,對于整型有 int32、int64 等,對于小數(shù)有 double、decimal128
  • 引入了 Timestamp、UTC datetime 等其它類型

需要注意的是,BSON 是以二進(jìn)制形式存儲的,所以可讀性不高。另外,它的最外層只能是對象。

PS:如果比較好奇 JSON 和 BSON 的規(guī)范,可以看下文末的參考鏈接 1 和 2

2 MongoDB 中常見的數(shù)據(jù)類型

官方文檔 BSON Types 一節(jié)(見參考鏈接 3)中對支持的數(shù)據(jù)類型列了一個表,我按自己的理解給大家梳理下。

JSON 支持的數(shù)據(jù)類型,BSON 肯定也支持,所以先用 JSON 去理解其中一部分?jǐn)?shù)據(jù)類型

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

BSON 對數(shù)字進(jìn)行了一些擴(kuò)充,我們記住常見的幾個就行

  • 32-bit integer(32 位整數(shù))
  • 64-bit integer(64 位整數(shù))
  • Double(浮點(diǎn)數(shù))
  • Decimal128(小數(shù))

Double 和 Decimal128 有什么差別呢?你可以簡單理解為后一種更加準(zhǔn)確,前者存儲的是一個大概值,后者則是存儲一個準(zhǔn)確值。比如,同樣是 9.99,Decimal128 存儲的是準(zhǔn)確的,Double 則是存的 9.9900000000000002131628...。一般情況我們使用 Double 沒有什么問題,但是在某些對數(shù)字準(zhǔn)確度有較大要求的場景下就要使用 Decimal128,比如電商、金融行業(yè)等。另外,它們所占的存儲空間也是不同的,前者是 8 個字節(jié),后者是 16 個字節(jié)。

BSON 還擴(kuò)充了一些類型,我們也挑幾個常用的認(rèn)識下

  • ObjectID

該類型主要用于文檔唯一 _id 的生成,長度為 12 個字節(jié)

-?前?4?個字節(jié)記錄的是時間戳
-?中間?5?個字節(jié)是隨機(jī)數(shù)
-?后?3?個字節(jié)是計數(shù)器

MongoDB 3.2 以及之前的版本對于中間 5 個字節(jié)的生成策略有些不同:前 3 個是機(jī)器 ID,后 2 個是進(jìn)程 ID。3.2 之后的版本使用的是隨機(jī)數(shù)。

注意:本文在對字節(jié)進(jìn)行前后描述時,前指的是高字節(jié)位,后指的低字節(jié)位

  • Timestamp

該類型主要用在 MongoDB 程序內(nèi)部,用于標(biāo)識操作的先后順序,長度為 8 個字節(jié)

-?前?4?個字節(jié)記錄的是時間戳
-?后?4?個字節(jié)記錄的是在同一秒內(nèi)某個操作的序號,這個序號是遞增的,由于同一秒內(nèi)經(jīng)常會有多個操作,所以采用這種方式記錄
  • Date

應(yīng)用如果要用到時間類型的話,一般會使用這個數(shù)據(jù)類型,它的底層其實是一個 64 位的整數(shù),記錄的也是時間戳,不過單位是毫秒。

另外說明下,如果你看過 BSON 的規(guī)格描述,你會發(fā)現(xiàn) MongoDB 中對于一些類型的命名和 BSON 有些差異。比如,MongoDB 官方文檔中 Object 其實和 BSON 中的 document 是同一種數(shù)據(jù)類型,只是名字不同。我們不用過于糾結(jié)這些,只要記住一種命名,比如 MongoDB 官方文檔中的,然后知道它代表著什么或者是怎么存的就行了。

如果需要比較全面的了解 MongoDB 中支持的數(shù)據(jù)類型,請查閱官方文檔 BSON Types 一節(jié)(參考鏈接 3)。

3 使用 Compass 查看數(shù)據(jù)類型

我們打開 Compass,在集合 video.movies 的詳情頁面,打開 Schema 標(biāo)簽頁,點(diǎn)擊 ANALYZE 按鈕后等待一小會后,我們可以看到文檔中各字段值的數(shù)據(jù)類型

列下部分字段的數(shù)據(jù)類型

  • _id:ObjectId
  • cast:3 種數(shù)據(jù)類型,有 Array、String 和 Undefined。由于 MongoDB 不會對某個字段的類型做強(qiáng)制要求,也就出現(xiàn)了不同文檔同一個字段類型不同的情況。Undefined 表示 cast 字段在某些文檔中是不存在的
  • viewerRating:3 種數(shù)據(jù)類型,有 Double、32-bit integer 和 Undefined

PS:這個小節(jié)中,集合的類型信息我都沒有列完,大家可以自己使用 Compass 看下,再看下其它集合的一些信息,然后對照前面的介紹熟悉一些常用的數(shù)據(jù)類型。

需要注意的是,上面的數(shù)據(jù)類型信息都是取樣統(tǒng)計的(一般是取 1000 條,具體信息可以看查詢框下的提示信息,比如上圖樣本量為 1000,總文檔量為 963534,比例大概是 0.1%),并非統(tǒng)計的集合中的所有文檔,所以不能百分百的保證全面。不過一般情況下這也夠了,因為同一個集合中的文檔字段大部分是相同的,即使有差異,取樣的時候大概率也能取到,所以統(tǒng)計結(jié)果還是十分接近于真實情況的。

再看下集合 citibike.trips

也列下部分字段的數(shù)據(jù)類型

  • end station location:Object,其中子文檔又有 2 個字段
    • coordinates:2 種數(shù)據(jù)類型,有 Array 和 Double
    • type:String
  • stop time:Date

字段 end station location 有點(diǎn)特殊,它的內(nèi)容類似這樣

"end?station?location":?{
????"type":?"Point",
????"coordinates":?[-73.99973337,?40.71910537]
}

在 MongoDB 中可以以這種方式存儲地理位置信息,type 指地理位置類型,coordinates 則指具體的坐標(biāo),這個對象在 MongoDB 中有個名字 GeoJSON object,可以理解為 MongoDB 基于 Object 類型擴(kuò)展出的新的類型,但這個類型并非 BSON 規(guī)范所有。

在 Compass 中我們可以啟用地理信息可視化的設(shè)置,依次點(diǎn)擊菜單項 Help -> Privacy Settings,會有彈窗

勾選設(shè)置 Enable Geographic Visualizations 后,點(diǎn)擊 Close 關(guān)閉彈窗,最后點(diǎn)擊下 ANALYZE 重新生成統(tǒng)計信息

可以看到,Compass 對取樣的文檔中的地理位置進(jìn)行了可視化。細(xì)心的伙伴可能會注意到,字段 end station location 下方展示的類型也從 document 變成了 coordinates,和前面 MongoDB 中的數(shù)據(jù)類型命名和 BSON 不一致一樣,我們不用太糾結(jié)命名,知道 coordinates 指的是 GeoJSON object 就行了。

4 小結(jié)

本文簡單介紹了 BSON,然后介紹了 MongoDB 中常用的 BSON 數(shù)據(jù)類型,最后借助 Compass 工具對這些類型進(jìn)行了熟悉。

5 參考

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

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。