MongoDB扩展JSON(V2)

在本页面

MongoDB Extended JSON v2 Usage

BSON Data Types and Associated Representations

Examples

| **IMPORTANT** |
| ------------- |
| 解惑:        |
            下一页讨论MongoDB Extended JSON v2。关于在遗留的MongoDB Extended JSON v1的讨论,见MongoDB Extended JSON (v1)(https://www.mongodb.com/docs/v6.0/reference/mongodb-extended-json-v1/)

JSON只能直接表示BSON支持的类型的一个子集。 为了保存类型信息,MongoDBJSON格式中添加了以下扩展。

  • 规范模式

    • 一种以牺牲可读性和互操作性为代价强调类型保存的字符串格式。也就是说,从规范到BSON的转换通常会保留类型信息,除非在某些特定情况下
  • 宽松模式

    • 一种以牺牲类型保存为代价强调可读性和互操作性的字符串格式。也就是说,从宽松格式到BSON格式的转换可能会丢失类型信息。

两种格式都符合JSON格式文件并且可以被各种MongoDB 驱动程序和工具解析。

MongoDB扩展JSON v2用法

驱动

以下驱动程序使用扩展JSON v2.0

  • C
  • C++
  • Go

  • Java

  • Node
  • Perl

  • PHPC

  • Python
  • Scala

    对于使用遗留的MongoDB Extended JSON v1c#Ruby,请参考MongoDB Extended JSON (v1).

扩展JSON方法

MongoDB为扩展JSON提供了以下方法:

方法                  描述
serialize           序列化BSON对象并以Extended JSON格式返回数据。
                    EJSON.serialize( db.<collection>.findOne() )

deserialize         将序列化文档转换为字段和值对。这些值有BSON 类型。
                                        EJSON.deserialize( <serialized object> )

stringify           转换元素和类型将反序列化对象中的字符串配对。
                                      EJSON.stringify( <deserialized object> )

parse               将字符串转化为元素和类型对
                    EJSON.parse( <string> )

有关使用示例,请参阅扩展的 JSON 对象转换

有关更多详细信息,请参阅文档:

MongoDB数据库工具

4.2版开始:

二进制                变化
bsondump            使用扩展JSON v2.0(规范模式)格式。
mongodump           元数据使用扩展 JSON v2.0(规范模式)格式。需要mongorestore支持扩展JSON v2.0(规范模式或放宽模式)格式的4.2                                        或更高版本。
                                         Tip:
                                         通常来说,mongodump和mongorestore需使用相同版本.
mongoexport         默认情况下以扩展 JSON v2.0(宽松模式)创建输出数据。
                                        如果使用--jsonFormat,则在扩展 JSON v2.0(规范模式)中创建输出数据。
mongoimport         默认情况下,导入数据采用Extended JSON v2.0(放松模式或规范模式)。
                                        如果指定了选项--legacy,则可以识别Extended JSON v1.0格式的数据。
                                        Tip:
                                        通常来说,mongoexport和mongoimport版本应该一致。

BSON数据类型和相关的表征

下面介绍了一些常见的BSON数据类型以及Canonicalrelax中的相关表示。

ArrayBinaryDate Decimal128DocumentDouble Int32Int64MaxKey MinKeyObjectIdRegular ExpressionTimestamp

Array

     标准                              宽松
[ <elements> ]                   <Same as Canonical>

其中数组元素如下:

    • 数组元素使用Extended JSON
    • 若要指定空数组,请省略内容[]

Binary

标准 宽松
{ "$binary": { "base64": "<payload>", "subType": "<t>" } }

各值如下:

  • ""
    • Base64编码(填充为“=”)有效负载字符串
  • ""
    • 对应于BSON二进制子类型的一个或两个字符的十六进制字符串

Date

1970年至9999年的日期,包括:

标准 宽松
{"$date": {"$numberLong": "<millis>"}} {"$date": "<ISO-8601 Date/Time Format>"}

对于1970年之前或9999年之后的日期:

标准 宽松
{"$date": {"$numberLong": "<millis>"}}

各值如下:

  • ""
    • 作为字符串的64位有符号整数。该值表示相对于epoch的毫秒数。
  • "<ISO-8601 Date/Time Format>"
    • ISO-8601 Internet Date/Time Format的日期作为字符串
    • date/time的最大时间精度为毫秒:
      • 如果小数部分不为零,小数秒正好有3位小数。
      • 否则,如果分数秒为零,则应省略。

Decimal128

标准 宽松
{ "$numberDecimal": "<number>" } <Same as Canonical>

各值如下:

Document

标准 宽松
{ <content> } <Same as Canonical>

其中document内容如下:

  • <content>
    • Name:value pairs使用Extended JSON
    • 若要指定一个空文档,请省略内容{}

Double

对于有限数

标准 宽松
{"$numberDouble": "<decimal string>" }

对于无限数或NAN:

标准 宽松
`{"$numberDouble": <"Infinity" "-Infinity" "NaN"> }`

各值如下:

  • "<decimal string>"
    • 作为字符串的64位有符号浮点数。
    • 一个非整数。整数被解析为整数而不是双精度数。

Int64

标准 宽松
{ "$numberLong": "<number>" }

各值如下:

  • ""
    • 作为字符串的64位有符号整数。
    • 64位有符号整数。

Int32

标准 宽松
{ "$numberInt": "<number>" }

各值如下:

  • ""
    • 作为字符串的32位有符号整数。
    • 32位有符号整数。

MaxKey

标准 宽松
{ "$maxKey": 1 } <Same as Canonical>

MaxKey BSON数据类型比所有其他类型都要高。有关BSON类型比较顺序的更多信息,请参阅Comparison/Sort Order顺序。

ObjectId

标准 宽松
{ "$oid": "<ObjectId bytes>" } <Same as Canonical>

各值如下:

  • ""
    • 表示ObjectId字节的24个字符的大端十六进制字符串。

Regular Expression

标准 宽松
{ "$regularExpression": { "pattern": "<regexPattern>", "options": "<options>" } } <Same as Canonical>

各值如下:

  • ""
    • 对应于正则表达式模式的字符串。 字符串可以包含有效的JSON字符和未转义的双引号(")字符, 但可能不包含未转义的正斜杠(/)字符。
  • ""
    • 指定BSON正则表达式选项('g', 'i', 'm'和's')的字符串或空字符串""
**IMPORTANT**
        选项必须按字母顺序排列。

Timestamp

标准 宽松
{"$timestamp": {"t": <t>, "i": <i>}} <Same as Canonical>

各值如下:

    • 从纪元开始的秒数的正整数。
    • 增量为正整数。

例子

下面的例子说明了扩展JSON的用法。

类型表示

字段名称 标准格式 宽松格式
"_id:" {"$oid":"5d505646cf6d4fe581014ab2"} {"$oid":"5d505646cf6d4fe581014ab2"}
"arrayField": ["hello",{"$numberInt":"10"}] ["hello",10]
"dateField": {"$date":{"$numberLong":"1565546054692"}} {"$date":"2019-08-11T17:54:14.692Z"}
"dateBefore1970": {"$date":{"$numberLong":"-1577923200000"}} {"$date":{"$numberLong":"-1577923200000"}}
"decimal128Field": {"$numberDecimal":"10.99"} {"$numberDecimal":"10.99"}
"documentField": {"a":"hello"} {"a":"hello"}
"doubleField": {"$numberDouble":"10.5"} 10.5
"infiniteNumber" {"$numberDouble":"Infinity"} {"$numberDouble":"Infinity"}
"int32field": {"$numberInt":"10"} 10
"int64Field": {"$numberLong":"50"} 50
"minKeyField": {"$minKey":1} {"$minKey":1}
"maxKeyField": {"$maxKey":1} {"$maxKey":1}
"regexField": {"$regularExpression":{"pattern":"^H","options":"i"}} {"$regularExpression":{"pattern":"^H","options":"i"}}
"timestampField": {"$timestamp":{"t":1565545664,"i":1}} {"$timestamp":{"t":1565545664,"i":1}}

扩展JSON对象转换

下面的简短示例创建一个文档对象,然后使用Extended JSON对象转换方法将对象转换为不同的形式。

Setup

conversions集合中创建一个document:

db.conversions.insertOne( { insertDate: new Date() } )

mongosh 返回一个文档对象:

{
  acknowledged: true,
  insertedId: ObjectId("61fbaf25671c45f3f5f4074a")
}

EJSON.serialize

序列化存储在MongoDB文档对象中的数据:

serialized = EJSON.serialize( db.conversions.findOne() )

mongosh 解析JavaScript对象并返回前缀为“$”types的值:

{
  _id: { '$oid': '61fbaf25671c45f3f5f4074a' },
  insertDate: { '$date': '2022-02-03T10:32:05.230Z' }
}

EJSON.deserialize

反序列化序列化对象:

EJSON.deserialize( serialized )

mongosh 解析JavaScript对象并返回默认为 mongosh type的值

{
  _id: new ObjectId( "61fbaf25671c45f3f5f4074a" ),
  insertDate: ISODate( "2022-02-03T10:32:05.230Z" )
}

EJSON.stringify

将对象转换为字符串:

stringified = EJSON.stringify( db.conversions.findOne() )

mongosh将转换对象的元素输出为字符串:

{
   "_id": {"$oid":"61fbaf25671c45f3f5f4074a"},
   "insertDate":{"$date":"2022-02-03T10:32:05.230Z"}
}

EJSON.parse

解析一个字符串创建一个对象:

EJSON.parse( stringified )

mongosh将转换后的字符串作为文档返回:

{
  _id: new ObjectId("61fbaf25671c45f3f5f4074a"),
  insertDate: ISODate("2022-02-03T10:32:05.230Z")
}

原文链接:https://www.mongodb.com/docs/v6.0/reference/mongodb-extended-json/

译者:杨帅

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-09-01 17:10:25

results matching ""

    No results matching ""