文档菜单
文档首页
/
MongoDB 手册
/ /

MongoDB 扩展 JSON (v1)

本页内容

  • MongoDB 扩展 JSON v1 和 MongoDB 驱动程序
  • 解析器和支持格式
  • BSON 数据类型及其相关表示

重要

消除歧义

以下页面讨论了 MongoDB 扩展 JSON v1(旧版扩展 JSON)。有关 MongoDB 扩展 JSON v2 的讨论,请参阅MongoDB 扩展 JSON (v2).

mongo中支持的数据类型,请参阅mongosh 数据类型.

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

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

以下驱动程序使用扩展JSON v1.0(旧版)

  • C#

  • Ruby

对于其他驱动程序,请参阅 MongoDB 扩展 JSON (v2)

以下可以解析严格模式下的表示,并且识别类型信息。

其他 JSON 解析器,包括 mongo 命令行,可以将严格模式下的表示解析为键值对,但 无法 识别类型信息。

以下可以解析 mongo 命令行模式下的表示,并且识别类型信息。

  • mongoimport 版本 4.0 及更早版本

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

  • mongo 命令行

在版本4.2之前,mongoexport以MongoDB扩展JSON v1的严格模式输出数据。

在版本4.2之前,bsondumpmongoShell模式输出。

以下展示了在严格模式mongo Shell模式下的BSON数据类型及其相关表示。

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

值如下

  • <bindata>是二进制字符串的base64表示。

  • <t>是表示单个字节的类型表示。在严格模式中它是一个十六进制字符串,在Shell模式中它是一个整数。参见扩展的bson文档。[http://bsonspec.org/spec.html](http://bsonspec.org/spec.html)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> 是自纪元 UTC 以来以毫秒表示的 64 位有符号整数的 JSON 表示形式。

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> 是包含由字母表示的regex选项的字符串。

  • <jOptions> 是可能仅包含字符 'g', 'i', 'm' 和 's' (自v1.9添加) 的字符串。因为JavaScript和mongo 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 } } )

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

重要

未定义的 BSON 类型已被 弃用mongosh 存储的是 null 值。

例如,使用相同的代码在 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 命令行界面中,你必须使用引号来插入 NumberLong,否则将产生错误。

例如,以下命令尝试将 9223372036854775807 作为 NumberLong 插入,并分别使用和未使用整数值周围的引号

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

高亮行在传统的 mongo 命令行界面中产生错误。在 mongosh 中插入成功。

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 被删除

返回

扩展 JSON (v2)