BSON: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
No edit summary
 
(27 intermediate revisions by 20 users not shown)
Line 1: Line 1:
{{Short description|Computer data interchange format}}
{{Infobox file format
{{Infobox file format
| screenshot = BSON website logo.svg
| name = BSON
| name = BSON
|_nomimecode = on
|_nomimecode = on
| mime = {{code|application/bson}}<ref name="mime">{{cite web |url=https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/bson-support-in-web-api-21 |title=BSON Support in ASP.NET Web API 2.1 - ASP.NET 4.x |date=2014-01-20 |website=Microsoft Docs |access-date=2010-01-12}}</ref>
| mime = ''none''<ref name="mime">[http://www.iana.org/assignments/media-types/index.html MIME Media Types - The Internet Assigned Numbers Authority]</ref>
| extension = .bson
| extension = .bson
| genre = Data interchange
| genre = Data interchange
| extended from = [[JSON]]
| extended from = [[JSON]]
| url = {{URL|https://bsonspec.org/}}
| standard = no [[Request for Comments|RFC]] yet
| url = {{URL|http://bsonspec.org/}}
}}
}}


'''BSON''' ({{IPAc-en|ˈ|b|iː|s|ə|n}}) is a [[computer]] data interchange format. The name "BSON" is based on the term [[JSON]] and stands for "Binary JSON".<ref name="bsonspec">[http://bsonspec.org BSON Specification]</ref>. It is a binary form for representing simple or complex [[data structure]]s including [[associative array]]s (also known as name-value pairs), integer indexed arrays, and a suite of fundamental scalar types.
'''BSON''' ({{IPAc-en|ˈ|b|iː|s|ə|n}}<ref name="bsonspec-org">{{cite web |title=BSON (Binary JSON) Serialization |url=https://bsonspec.org/ |access-date=23 November 2021}}</ref>) is a [[computer]] data interchange format. The name "BSON" is based on the term [[JSON]] and stands for "Binary JSON".<ref name="bsonspec-org" /> It is a binary form for representing simple or complex [[data structure]]s including [[associative array]]s (also known as name-value pairs), integer indexed arrays, and a suite of fundamental scalar types.
BSON originated in 2009 at [[MongoDB]]. Several scalar data types are of specific interest to MongoDB and the format is used both as a data storage and network transfer format for the MongoDB database, but it can be used independently outside of MongoDB.
BSON originated in 2009 at [[MongoDB]]. Several scalar data types are of specific interest to MongoDB and the format is used both as a data storage and network transfer format for the MongoDB database, but it can be used independently outside of MongoDB.
Implementations are available in a variety of languages such as [[C (programming language)|C]], [[C++]], [[C Sharp (programming language)|C#]], [[D (programming language)|D]], [[Delphi (IDE)|Delphi]], [[Erlang (programming language)|Erlang]], [[Go (programming language)|Go]], [[Haskell (programming language)|Haskell]], [[Java (programming language)|Java]], [[JavaScript]], [[Julia (programming language)|Julia]], [[Lua (programming language)|Lua]], [[OCaml]], [[Perl]], [[PHP]], [[Python (programming language)|Python]], [[Ruby (programming language)|Ruby]], [[Rust (programming language)|Rust]], [[Scala (programming language)|Scala]], [[Smalltalk]], and [[Swift (programming language)|Swift]].<ref>{{cite web |url=http://bsonspec.org/implementations.html |title=BSON Implementation Projects |accessdate=20 Jan 2019 }}</ref>
Implementations are available in a variety of languages such as [[C (programming language)|C]], [[C++]], [[C Sharp (programming language)|C#]], [[D (programming language)|D]], [[Delphi (IDE)|Delphi]], [[Erlang (programming language)|Erlang]], [[Go (programming language)|Go]], [[Haskell (programming language)|Haskell]], [[Java (programming language)|Java]], [[JavaScript]], [[Julia (programming language)|Julia]], [[Lua (programming language)|Lua]], [[OCaml]], [[Perl]], [[PHP]], [[Python (programming language)|Python]], [[Ruby (programming language)|Ruby]], [[Rust (programming language)|Rust]], [[Scala (programming language)|Scala]], [[Smalltalk]], and [[Swift (programming language)|Swift]].<ref>{{cite web |url=https://bsonspec.org/implementations.html |title=BSON Implementation Projects |access-date=2021-11-24 }}</ref>


==Data types and syntax==
==Data types and syntax==
BSON has a published specification <ref>{{Cite web|url=http://bsonspec.org/spec.html|title=BSON (Binary JSON): Specification|website=bsonspec.org|access-date=2018-01-17}}</ref><ref>{{Cite web|url=https://www.informit.com/articles/article.aspx?p=2247310&seqNum=4%20api.mongodb.com/python/current/api/bson/regex.html|title=Introducing NoSQL and MongoDB {{!}} What Is NoSQL? {{!}} InformIT|website=www.informit.com|access-date=2018-01-17}}</ref>. The topmost element in the structure must be of type BSON object and
BSON has a published specification.<ref>{{Cite web|url=https://bsonspec.org/spec.html|title=BSON (Binary JSON): Specification|website=bsonspec.org|access-date=2021-11-24}}</ref><ref>{{Cite web|url=https://www.informit.com/articles/article.aspx?p=2247310&seqNum=4%20api.mongodb.com/python/current/api/bson/regex.html|title=Introducing NoSQL and MongoDB {{!}} What Is NoSQL? {{!}} InformIT|website=www.informit.com|access-date=2018-01-17}}</ref> The topmost element in the structure must be of type BSON object and
contains 1 or more elements, where an element consists of a field name, a type, and a value. Field names are strings. Types include:
contains 1 or more elements, where an element consists of a field name, a type, and a value. Field names are strings. Types include:


* [[Unicode]] string (using the [[UTF-8]] encoding)
* string
* 32 bit integer
* 32 bit integer
* 64 bit integer
* 64 bit integer
* double (64-bit [[IEEE 754]] floating point number)
* [[Double-precision floating-point format|double]] (64-bit [[IEEE 754]] floating point number)
* decimal128 (128-bit [[IEEE 754-2008]] floating point number; Binary Integer Decimal (BID) variant), suitable as a carrier for decimal-place sensitive financial data and arbitrary precision numerics with 34 decimal digits of precision, a max value of approximately 10<sup>6145</sup>
* [[decimal128 floating-point format|decimal128]] (128-bit [[IEEE 754-2008]] floating point number; [[Binary integer decimal|Binary Integer Decimal]] (BID) variant), suitable as a carrier for decimal-place sensitive financial data and arbitrary precision numerics with 34 decimal digits of precision, a max value of approximately 10<sup>6145</sup>
* datetime w/o timezone (long integer number of milliseconds since the [[Unix epoch]])
* datetime w/o time zone (long integer number of milliseconds since the [[Unix epoch]])
* byte array (for arbitrary binary data)
* byte array (for arbitrary binary data)
* [[boolean datatype|boolean]] (<code>true</code> and <code>false</code>)
* [[boolean datatype|boolean]] (<code>true</code> and <code>false</code>)
Line 31: Line 32:
* JavaScript code
* JavaScript code
* [[MD5]] binary data
* [[MD5]] binary data
* [[Regular expression]] ([[Perl]] compatible regular expressions ("[[PCRE]]") version 8.41 with UTF-8 support)<ref>{{Cite web|url=https://api.mongodb.com/python/current/api/bson/regex.html|title=regex – Tools for representing MongoDB regular expressions — PyMongo 3.6.0 documentation|website=api.mongodb.com|access-date=2018-01-17}}</ref>
* [[Regular expression]] ([[Perl]] compatible regular expressions ("[[PCRE]]") version 8.41 with UTF-8 support)<ref>{{Cite web|url=https://api.mongodb.com/python/current/api/bson/regex.html|title=regex – Tools for representing MongoDB regular expressions — PyMongo 3.6.0 documentation|website=api.mongodb.com|access-date=2018-01-17|archive-date=2016-05-10|archive-url=https://web.archive.org/web/20160510224657/https://api.mongodb.com/python/current/api/bson/regex.html|url-status=dead}}</ref>

An important differentiator to [[JSON]] is that BSON contains types not present in JSON (e.g. datetime and byte array) and offers type-strict handling for several numeric types instead of a universal "number" type.


An important differentiator to [[JSON]] is that BSON contains types not present in JSON (e.g. datetime and byte array) and offers type-strict handling for several numeric types instead of a universal "number" type. For situations where these additional types need to be represented in a textual way, MongoDB's Extended JSON format<ref>{{Cite web|url=https://docs.mongodb.com/manual/reference/mongodb-extended-json/|title=MongoDB Extended JSON documentation|website=docs.mongodb.com|access-date=2020-05-03}}</ref> can be used.


==Efficiency==
==Efficiency==
Compared to JSON, BSON is designed to be efficient both in storage space and scan-speed. Large elements in a BSON document are prefixed with a length field to facilitate scanning. In some cases, BSON will use more space than JSON due to the length prefixes and explicit array indices.<ref name="bsonspec"/>
Compared to JSON, BSON is designed to be efficient both in storage space and scan-speed. Large elements in a BSON document are prefixed with a length field to facilitate scanning. In some cases, BSON will use more space than JSON due to the length prefixes and explicit array indices.<ref name="bsonspec-org"/>


== Example ==
== Example ==
A document such as {"hello":"world"} will be stored as:
A document such as {{code|{"hello": "world"} }} will be stored as:

<source lang="c">


<pre>
Bson:
\x16\x00\x00\x00 // total document size
\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
\x02 // 0x02 = type String
hello\x00 // field name
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value (size of value, value, null terminator)
\x06\x00\x00\x00world\x00 // field value (size of value, value, null terminator)
\x00 // 0x00 = type EOO ('end of object')
\x00 // 0x00 = type EOO ('end of object')
</source>
</pre>


== See also ==
== See also ==
Line 58: Line 56:
* [[Smile_(data_interchange_format)|Smile]] (binary JSON)
* [[Smile_(data_interchange_format)|Smile]] (binary JSON)
* [[UBJSON]]
* [[UBJSON]]
* [[Protocol Buffers]]
* [[Action Message Format]]
* [[Apache Thrift]]
* [[MessagePack]]
* [[Document-oriented database]]
** [[MongoDB]]
* [[Abstract Syntax Notation One]] (ASN.1)
* [[Wireless Binary XML]] (WBXML)
* [[Efficient XML Interchange]]
* [https://github.com/Sereal/Sereal Sereal]


==References==
==References==
Line 73: Line 61:


== External links ==
== External links ==
* [http://bsonspec.org/ BSON Specification]
* {{Official website|https://bsonspec.org/}}
* [http://www.mongodb.org/display/DOCS/BSON BSON documentation on the MongoDB website]
* [https://docs.mongodb.com/database-tools/bsondump/ {{mono|bsondump}} tool included with MongoDB]
* [http://docs.mongodb.org/manual/reference/bsondump/ <tt>bsondump</tt> tool included with MongoDB]


{{Data Exchange}}
{{Data Exchange}}

Latest revision as of 09:43, 29 November 2023

BSON
Filename extension
.bson
Internet media typeapplication/bson[1]
Type of formatData interchange
Extended fromJSON
Websitebsonspec.org

BSON (/ˈbsən/[2]) is a computer data interchange format. The name "BSON" is based on the term JSON and stands for "Binary JSON".[2] It is a binary form for representing simple or complex data structures including associative arrays (also known as name-value pairs), integer indexed arrays, and a suite of fundamental scalar types. BSON originated in 2009 at MongoDB. Several scalar data types are of specific interest to MongoDB and the format is used both as a data storage and network transfer format for the MongoDB database, but it can be used independently outside of MongoDB. Implementations are available in a variety of languages such as C, C++, C#, D, Delphi, Erlang, Go, Haskell, Java, JavaScript, Julia, Lua, OCaml, Perl, PHP, Python, Ruby, Rust, Scala, Smalltalk, and Swift.[3]

Data types and syntax[edit]

BSON has a published specification.[4][5] The topmost element in the structure must be of type BSON object and contains 1 or more elements, where an element consists of a field name, a type, and a value. Field names are strings. Types include:

  • Unicode string (using the UTF-8 encoding)
  • 32 bit integer
  • 64 bit integer
  • double (64-bit IEEE 754 floating point number)
  • decimal128 (128-bit IEEE 754-2008 floating point number; Binary Integer Decimal (BID) variant), suitable as a carrier for decimal-place sensitive financial data and arbitrary precision numerics with 34 decimal digits of precision, a max value of approximately 106145
  • datetime w/o time zone (long integer number of milliseconds since the Unix epoch)
  • byte array (for arbitrary binary data)
  • boolean (true and false)
  • null
  • BSON object
  • BSON array
  • JavaScript code
  • MD5 binary data
  • Regular expression (Perl compatible regular expressions ("PCRE") version 8.41 with UTF-8 support)[6]

An important differentiator to JSON is that BSON contains types not present in JSON (e.g. datetime and byte array) and offers type-strict handling for several numeric types instead of a universal "number" type. For situations where these additional types need to be represented in a textual way, MongoDB's Extended JSON format[7] can be used.

Efficiency[edit]

Compared to JSON, BSON is designed to be efficient both in storage space and scan-speed. Large elements in a BSON document are prefixed with a length field to facilitate scanning. In some cases, BSON will use more space than JSON due to the length prefixes and explicit array indices.[2]

Example[edit]

A document such as {"hello": "world"} will be stored as:

\x16\x00\x00\x00          // total document size
\x02                      // 0x02 = type String
hello\x00                 // field name
\x06\x00\x00\x00world\x00 // field value (size of value, value, null terminator)
\x00                      // 0x00 = type EOO ('end of object')

See also[edit]

References[edit]

  1. ^ "BSON Support in ASP.NET Web API 2.1 - ASP.NET 4.x". Microsoft Docs. 2014-01-20. Retrieved 2010-01-12.
  2. ^ a b c "BSON (Binary JSON) Serialization". Retrieved 23 November 2021.
  3. ^ "BSON Implementation Projects". Retrieved 2021-11-24.
  4. ^ "BSON (Binary JSON): Specification". bsonspec.org. Retrieved 2021-11-24.
  5. ^ "Introducing NoSQL and MongoDB | What Is NoSQL? | InformIT". www.informit.com. Retrieved 2018-01-17.
  6. ^ "regex – Tools for representing MongoDB regular expressions — PyMongo 3.6.0 documentation". api.mongodb.com. Archived from the original on 2016-05-10. Retrieved 2018-01-17.
  7. ^ "MongoDB Extended JSON documentation". docs.mongodb.com. Retrieved 2020-05-03.

External links[edit]