Docs 菜单

Docs 主页开发应用程序MongoDB Manual

MongoDB 扩展 JSON (v1)

在此页面上

  • MongoDB 扩展 JSON v 1和 MongoDB 驱动程序
  • 解析器和支持的格式
  • BSON 数据类型和相关表示形式

重要

消歧

以下页面将讨论 MongoDB 扩展 JSON v 1 (传统扩展 JSON)。有关 MongoDB 扩展 JSON v 2的讨论,请参阅MongoDB 扩展 JSON (v 2 )。

有关 mongo支持的数据类型,请参阅 mongosh 数据类型。

有关旧版mongo Shell 中支持的数据类型,请参阅旧版mongo Shell 中的数据类型。

JSON只能表示BSON支持的类型的子集。为了保留类型信息,MongoDB 在 JSON 格式中添加了以下扩展:

各种数据类型使用的表示形式取决于解析 JSON 的上下文。

以下驱动程序使用扩展 JSON v 1 。 0 (旧版)

  • C#

  • Ruby

有关其他驱动程序,请参阅MongoDB Extended JSON (v 2 )。

以下可以通过识别类型信息来解析严格模式下的表示。

其他 JSON 解析器(包括mongo Shell)可以将严格模式表示解析为键/值对,但无法识别类型信息。

以下代码可以通过识别类型信息来解析mongo shell 模式下的表示。

  • mongoimport 版本4 。 0及更早版本

  • --query 各种 MongoDB 工具的选项

  • mongo 外壳

4之前的版本。 2 、 mongoexport以 MongoDB 扩展 JSON v 1的严格模式输出数据。

4之前的版本。 2 、 bsondumpmongo Shell 模式下输出。

下面介绍 BSON 数据类型以及严格模式mongo Shell 模式下的相关表示形式。

data_binary
严格模式
mongo Shell 模式
{ "$binary": "<bindata>", "$type": "<t>" }
BinData ( <t>, <bindata> )

其中的值如下所示:

  • <bindata> 是二进制字符串的基本64表示形式。

  • <t> 是指示数据类型的单个字节的表示形式。在 严格模式下 ,它是一个十六进制字符串,在 Shell 模式下 ,它是一个整数。请参阅扩展 bson 文档。 http://bsonspec.org/spec.html

data_date
严格模式
mongo Shell 模式
{ "$date": "<date>" }
new Date ( <date> )

严格模式下<date>是 ISO- 8601日期格式,模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>后面带有必填时区字段。

Shell 模式下<date>是64位带符号整数的 JSON 表示形式,给出自 UTC 纪元以来的毫秒数。

data_timestamp
严格模式
mongo Shell 模式
{ "$timestamp": { "t": <t>, "i": <i> } }
Timestamp( <t>, <i> )

其中的值如下所示:

  • <t> 是自纪元以来的秒数的32位无符号整数的 JSON 表示形式。

  • <i> 是一个32位无符号整数,表示增量。

data_regex
严格模式
mongo Shell 模式
{ "$regex": "<sRegex>", "$options": "<sOptions>" }
/<jRegex>/<jOptions>

其中的值如下所示:

  • <sRegex> 是一串有效的 JSON 字符。

  • <jRegex> 是一个字符串,可以包含有效的 JSON 字符和非转义双引号 ( " ) 字符,但不能包含未转义的正斜杠 ( / ) 字符。

  • <sOptions> 是一个字符串,其中包含由字母表中的字母表示的正则表达式选项。

  • <jOptions> 是一个字符串,只能包含字符 'g'、'i'、'm' 和 's'(在 v1.9 中添加)。 由于JavaScriptmongo Shell表示形式支持有限范围的选项,因此在转换为该表示形式时,所有不合格的选项都将被删除。

data_oid
严格模式
mongo Shell 模式
{ "$oid": "<id>" }
ObjectId( "<id>" )

其中的值如下所示:

  • <id> 是一个包含24字符的十六进制字符串。

data_ref
严格模式
mongo Shell 模式
{ "$ref": "<name>", "$id": "<id>" }
DBRef("<name>", "<id>")

其中的值如下所示:

  • <name> 是一串有效的 JSON 字符。

  • <id> 是任何有效的扩展 JSON 类型。

data_undefined
严格模式
mongo Shell 模式
{ "$undefined": true }
undefined

JavaScript/BSON 未定义类型的表示形式。

不能在查询文档中使用undefined 。考虑使用旧版mongo shell 将以下文档插入到people集合中:

db.people.insertOne( { name : "Sally", age : undefined } )

以下查询返回错误:

db.people.find( { age : undefined } )
db.people.find( { age : { $gte : undefined } } )

但是,您可以使用$type查询未定义的值,如下所示:

db.people.find( { age : { $type : 6 } } )

此查询返回age字段值为undefined的所有文档。

重要

未定义的 BSON 类型已 弃用mongosh 会改为存储空值。

例如,使用相同的代码在mongosh和旧版mongo shell 中插入文档:

db.people.insertOne( { name : "Sally", age : undefined } )

生成的文档有所不同:

{ "name" : "Sally", "age" : null }
{ "name" : "Sally", "age" : undefined }
data_minkey
严格模式
mongo Shell 模式
{ "$minKey": 1 }
MinKey

MinKey BSON 数据类型的表示形式,其比较值低于所有其他类型。有关 BSON 类型的比较顺序的更多信息,请参阅比较/排序顺序

data_maxkey
严格模式
mongo Shell 模式
{ "$maxKey": 1 }
MaxKey

MaxKey BSON 数据类型的表示形式,其比较值高于所有其他类型。有关 BSON 类型的比较顺序的更多信息,请参阅比较/排序顺序

data_numberlong
严格模式
mongo Shell 模式
{ "$numberLong": "<number>" }
NumberLong( "<number>" )

NumberLong 是一个 64 位有符号整数。 在旧版mongo shell 中,必须使用引号插入NumberLong ,否则操作将产生错误。

例如,以下命令尝试将9223372036854775807作为NumberLong插入,在整数值两边带或不带引号:

db.json.insertOne( { longQuoted : NumberLong("9223372036854775807") } )
db.json.insertOne( { longUnQuoted : NumberLong(9223372036854775807) } )

突出显示的行会在旧版mongo shell 中产生错误。 mongosh插入成功。

版本 3.4 中的新增功能

data_numberdecimal
严格模式
mongo Shell 模式
{ "$numberDecimal": "<number>" }
NumberDecimal( "<number>" )

NumberDecimal 是一个 高精度十进制数 。必须包含引号,否则输入的数字将被视为双精度值,从而导致数据丢失。

例如,以下命令将123.40作为NumberDecimal插入,该值带或不带引号:

db.json.insertOne( { decimalQuoted : NumberDecimal("123.40") } )
db.json.insertOne( { decimalUnQuoted : NumberDecimal(123.40) } )

检索文档时, decimalUnQuoted的值已更改,而decimalQuoted保留其指定的精度:

db.json.find()
{ "_id" : ObjectId("596f88b7b613bb04f80a1ea9"), "decimalQuoted" : NumberDecimal("123.40") }
{ "_id" : ObjectId("596f88c9b613bb04f80a1eaa"), "decimalUnQuoted" : NumberDecimal("123.400000000000") }

重要

这种插入行为在mongosh中有所不同。

带引号的字符串格式NumberDecimal("123.40")已弃用。插入成功,但也产生警告。

不带引号的字符串格式NumberDecimal(123.40)会将值存储为123.4 。末尾的0被删除。

← MongoDB 扩展 JSON (v2)