扩展JSON(V1)


进入MongoDB中文手册(4.2版本)目录

消除歧义
本章节讨论了MongoDB Extended JSON v1(旧式扩展JSON)。有关MongoDB扩展JSON v2的讨论,请参阅 扩展JSON(v2)。
有关mongo Shell的类型的包装器方法,请参阅 mongo Shell中的数据类型。

JSON只能直接表达 BSON支持的类型的子集。为了保留类型信息,MongoDB对JSON格式进行了以下扩展:

  • 严格模式。BSON类型的严格模式的表现形式符合JSON RFC
    。任何JSON解析器都可以将这些严格的模式表示形式解析为键/值对。但是,只有MongoDB内部JSON解析器才能识别相应格式表达的类型信息。
  • mongo Shell模式。MongoDB内部JSON解析器和 mongo shell程序可以解析此模式。

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

1 扩展JSON v1和MongoDB驱动程序

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

2 解析器和支持的格式

2.1 在严格模式下输入

下面可以在识别出类型信息的情况下以严格模式解析表达形式。

  • mongoimport 版本4.0及更早版本;
  • 各种MongoDB工具的–query选项;
  • MongoDB指南针(MongoDB Compass)。

其他JSON解析器(包括mongo shell)可以将严格模式的表达形式解析为键/值对,但不能识别类型信息。

2.2 在mongo Shell模式下输入

下面可以解析mongo shell模式中的表达形式,且能识别的类型信息。

  • mongoimport 版本4.0及更早版本;
  • 各种MongoDB工具的–query选项;
  • mongo shell。

2.3 在严格模式下输出

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

2.4 在mongoShell模式下输出

在4.2版之前,bsondump以mongo Shell模式输出。

3 BSON数据类型和关联的表达形式(Associated Representations)

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

3.1 二进制(Binary)

data_binary

严格模式mongo shell模式
{ “$binary”: “<bindata>”, “$type”: “<t>” }BinData ( <t>, <bindata> )
  • <bindata> 是以base64编码的二进制字符串;
  • <t> 是单个字节表示的数据类型。在 严格模式下,它是一个十六进制字符串,在shell模式下,它是一个整数。请参阅扩展的bson文档http://bsonspec.org/spec.html

3.2 日期(Date)

data_date

严格模式mongo shell模式
{ “$date”: “<date>” }new Date ( <date> )

在严格模式下,<date>是ISO-8601日期格式,模板YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>后时区字段必填。
在Shell模式下,<date>是64位有符号整数的JSON表达形式,整数是纪元UTC(epoch UTC)以来的毫秒数。

3.3 时间戳(Timestamp)

data_timestamp

严格模式mongo shell模式
{“ $timestamp”:{“ t”:<t>,“ i”:<i>}}Timestamp( <t>,<i> )
  • <t> 是32位无符号整数的JSON表达形式,整数是纪元(epoch)以来的毫秒数。
  • <i> 是递增的32位无符号整数。

3.4 正则表达式(Regular Expression)

data_regex

严格模式mongo shell模式
{ “$regex”: “<sRegex>”, “$options”: “<sOptions>” }/<jRegex>/<jOptions>
  • <sRegex> 是有效JSON字符的字符串。
  • <jRegex> 是一个字符串,其中可能包含有效的JSON字符和未转义的双引号(")字符,但可能不包含未转义的正斜杠(/)字符。
  • <sOptions> 是一个字符串,其中包含由字母表示的正则表达式选项。
  • 是一个只能包含字符“ g”,“ i”,“ m”和“ s”(在v1.9中添加)的字符串。由于JavaScript和mongo Shell表达形式支持的选项范围有限,因此转换为该表达形式时,所有不符合要求的选项都将被删除。

3.5 OID

data_oid

严格模式mongo shell模式
{ “$oid”: “<id>” }ObjectId( “<id>” )

<id>是24个字符的十六进制字符串。

3.6 DB引用(DB Reference)

data_ref

严格模式mongo shell模式
{ “$ref”: “<name>”, “$id”: “<id>” }DBRef("<name>", “<id>”)
  • <name> 是有效JSON字符的字符串;
  • <id> 是任何有效的扩展JSON类型。

3.7 未定义类型(Undefined Type)

data_undefined

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

JavaScript / BSON未定义类型的表达形式。
您不能在查询文档中使用undefined。考虑将以下文档插入people集合中:

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

以下查询会错误:

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

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

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

该查询返回的具有undefined值的age字段的所有文档。

3.8 MinKey

data_minkey

严格模式mongo shell模式
{"$minKey": 1 }MinKey

MinKey BSON数据类型的表达形式,MinKey BSON数据类型比较顺序比其他所有所有类型低。有关BSON类型的比较顺序的更多信息,请参见 比较/排序(Comparison/Sort Order)。

3.9 MaxKey

data_maxkey

严格模式mongo shell模式
{"$minKey": 1 }MaxKey

MaxKeyBSON数据类型的表达形式,MaxKeyBSON数据类型比较顺序比其他所有所有类型高。有关BSON类型的比较顺序的更多信息,请参见 比较/排序(Comparison/Sort Order)。

3.10 NumberLong

data_numberlong

严格模式mongo shell模式
{"$numberLong": “<number>” }NumberLong( “<number>” )

NumberLong是一个64位有符号整数。您必须包括引号,否则它将被解释为浮点数,从而导致准确性下降。
例如,以下命令在整数值9223372036854775807前后插入带引号和不带引号时:

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

检索文档时,longUnQuoted的值已更改,但longQuoted仍保持其准确性:

db.json.find()
{ "_id" : ObjectId("54ee1f2d33335326d70987df"), "longQuoted" : NumberLong("9223372036854775807") }
{ "_id" : ObjectId("54ee1f7433335326d70987e0"), "longUnQuoted" : NumberLong("-9223372036854775808") }

3.11 NumberDecimal

3.4版的新功能。
data_numberdecimal

严格模式mongo shell模式
“$numberDecimal”: “<number>”NumberDecimal( “<number>” )

NumberDecimal是一个高精度(high-precision decima)的小数。您必须包括引号,否则输入数字将被视为双精度(double)数字,从而导致数据丢失。
例如,下面的命令将123.40作为 NumberDecimal插入的前后插入带引号和不带引号时:

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

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

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

进入MongoDB中文手册(4.2版本)目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值