JSON扩展协议研究使用:BSON 和 EJSON

BSON: Binary JSON 研究

一种数据交换格式,用于 MongoDB 的数据存储和网络格式传输,也可以用于任何支持二进制和 BSON 协议的服务。

对比 JSON

可以理解为:二进制的 JSON。

借助官方 SDK,可以用类似 JSON 的方式描述数据结构,并且将其编译为二进制。

1
2
3
4
5
6
7
8
9
10
11
12
13
const BSON = require("bson");
const Long = BSON.Long;

// Serialize a document
const doc = { long: Long.fromNumber(100), name: "dongyuanxin", arr: [1, 2] };
// Output: data: <Buffer 41 00 00 00 12 6c 6f 6e 67 00 64 00 00 00 00 00 00 00 02 6e 61 6d 65 00 0c 00 00 00 64 6f 6e 67 79 75 61 6e 78 69 6e 00 04 61 72 72 00 13 00 00 00 10 ... 15 more bytes>
const data = BSON.serialize(doc);
console.log("data:", data);

// Deserialize the resulting Buffer
const doc_2 = BSON.deserialize(data);
// Output: doc_2: { long: 100, name: 'dongyuanxin', arr: [ 1, 2 ] }
console.log("doc_2:", doc_2);

为什么使用 BSON?

  • 更快的遍历速度:不需要对 json 进行字符串解析,而是直接保存元素长度在头部,直接进行seek()即可
  • 修改数据移动更少:对于 json,将 9 改为 10,字符变多,后面数据都需要移位;bson 可以指定类型(如代码所示),从而提前开辟空间。
  • 数据类型更全面

参考链接

EJSON 研究

它是 JSON 的扩展语法,和 BSON 类似,由 MongoDB 提出。

对比 JSON

本质上还是 JSON,只是支持更多的数据类型表示。

而这些数据类型,最终都会被转换为 JSON。

例如 EJSON 中Date类型代表日期,那么它会被转为:

1
date: { '$date': '2020-08-25T05:38:03.179Z' }

类似的还有 GEO(地理位置)、Point(图形)等高级数据类型。

对比 BSON

它的高级类型和 BSON 高级类型是通用的,开发时,均使用bson.js 这个库即可。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const BSON = require("bson");
const EJSON = BSON.EJSON;
console.log(
EJSON.serialize({
date: new Date(),
hello: Long.fromNumber(100),
test: new BSON.Double(
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000
),
int32: new BSON.Int32(123),
arr: [1, 2],
maxKey: new BSON.MaxKey(),
objId: new BSON.ObjectId(`123456789011`),
hello2: Long.fromNumber(
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000
),
})
);

输出:

1
2
3
4
5
6
7
8
9
10
{
date: { '$date': '2020-08-25T05:38:03.179Z' },
hello: 100,
test: 1e+84,
int32: 123,
arr: [ 1, 2 ],
maxKey: { '$maxKey': 1 },
objId: { '$oid': '313233343536373839303131' },
hello2: 9223372036854776000
}

优点

对比 JSON:

  • 支持更高级的数据类型
  • 高级类型会被转化为 JSON,兼容性好

对比 BSON:

  • 不是二进制,语义化更明显
  • 可以在任何平台交换数据,例如一些不支持二进制的浏览器

参考