- MongoDB進階與實戰:微服務整合、性能優化、架構管理
- 唐卓章
- 7字
- 2021-05-19 17:44:41
第3章 數據模型
3.1 BSON協議與類型
JSON與BSON是什么關系?MongoDB為什么會使用BSON?在初次接觸MongoDB時,或許有不少人對此存在疑惑。下面的內容,將會講解其中的細節。
3.1.1 JSON標準
JSON是當今非常通用的一種跨語言Web數據交互格式,屬于ECMAScript標準規范的一個子集。JSON(JavaScript Object Notation, JS對象簡譜)即JavaScript對象表示法。顧名思義,JSON與JavaScript語言是分不開的,它是JavaScript對象的一種文本表現形式。
作為一種輕量級的數據交換格式,JSON的可讀性非常好,而且非常便于系統生成和解析,這些優勢也讓它逐漸取代了XML標準在Web領域的地位,當今許多流行的Web應用開發框架,如SpringBoot都選擇了JSON作為默認的數據編/解碼格式。
以JSON格式定義的數據形式如下:

總的來說,JSON由兩種基本結構組成:
● 鍵值對的集合,等同于我們所說的對象、字典、哈希表(hash table)等數據結構,比如一個用戶會同時擁有名稱(name)、年齡(age)等字段信息;這個結構還可以支持嵌套,如用戶的地址信息(address)作為子對象,地址中又可以包含郵政編碼(zcode)、詳細街道地址(street)等。
● 有序的數據列表,通常對應于數組形式,如上述例子中的faviorites字段,表示一個用戶可以有多種偏好的標簽信息。
JSON只定義了6種數據類型,如圖3-1所示。

圖3-1 JSON數據類型
3.1.2 BSON和JSON
大多數情況下,使用JSON作為數據交互格式已經是理想的選擇,但是JSON基于文本的解析效率并不是最好的,在某些場景下往往會考慮選擇更合適的編/解碼格式,一些做法如:
● 在微服務架構中,使用gRPC(基于Google的Protobuf)可以獲得更好的網絡利用率。
● 分布式中間件、數據庫,使用私有定制的TCP數據包格式來提供高性能、低延時的計算能力。
BSON(Binary JSON)是二進制版本的JSON,其在性能方面有更優的表現。BSON在許多方面和JSON保持一致,其同樣也支持內嵌的文檔對象和數組結構。二者最大的區別在于JSON是基于文本的,而BSON則是二進制(字節流)編/解碼的形式。除此之外,BSON還提供了一些擴展的數據類型,比如日期、二進制數據等。
為了更淺顯地表示二者的不同,可以看看下面這個簡單的JSON對象:

其對應的BSON的格式編碼為:

BSON由10gen團隊設計并開源,目前主要用于MongoDB數據庫。
MongoDB在文檔存儲、命令協議上都采用了BSON作為編/解碼格式,主要具有如下優勢:
● 類JSON的輕量級語義,支持簡單清晰的嵌套、數組層次結構,可以實現無模式(模式靈活)的文檔結構。
● 更高效的遍歷,BSON在編碼時會記錄每個元素的長度,可以直接通過seek操作進行元素的內容讀取,相對JSON解析來說,遍歷速度更快。
● 更豐富的數據類型,除了JSON的基本數據類型,BSON還提供了MongoDB所需的一些擴展類型,這更加方便數據的表示和操作。
在空間的使用上,BSON相比JSON并沒有明顯的優勢。
3.1.3 BSON的數據類型
BSON的數據類型見表3-1。
表3-1 BSON的數據類型

續表

下面回顧一下本節的要點:
(1)JSON是通用的、輕量級的Web數據交換格式,支持嵌套的對象和數組結構,其本身也是無模式的。
(2)BSON是JSON的二進制版本,除了具備更高的性能,還提供了一些擴展的數據類型。
(3)MongoDB內部使用BSON數據格式,但由于BSON與JSON非常相近,許多情況下稱MongoDB是基于JSON的說法也是合理的。
- Dynamics 365 for Finance and Operations Development Cookbook(Fourth Edition)
- Mastering JavaScript Functional Programming
- 精通JavaScript+jQuery:100%動態網頁設計密碼
- AngularJS Testing Cookbook
- Java程序員面試算法寶典
- Unity 5 for Android Essentials
- Mastering JavaScript Design Patterns(Second Edition)
- Test-Driven JavaScript Development
- Learning Material Design
- ExtJS Web應用程序開發指南第2版
- Keil Cx51 V7.0單片機高級語言編程與μVision2應用實踐
- Java程序設計及應用開發
- MySQL從入門到精通
- JSP編程教程
- Unreal Engine 4 Scripting with C++ Cookbook