(翻译) MongoDB(6) MongoDB 继承 JSON

news/2024/5/20 22:26:53

JSON 所支持的类型仅是 BSON 所支持的一部分(子集). 不仅保留了类型信息, MongoDB 还为 JSON 格式增加了以下扩展:

  • 严格模式. BSON 类型的严格模式符合JSON RFC. 任何 JSON 解析器都可以将这些严格模式的表示解析为键/值对; 然而, 仅有 MongoDB 内部 JSON 解析器可以识别由格式所传达的类型信息.

  • mongo Shell 模式. MongoDB 内部 JSON 解析器和 mongo shell 都可以解析这个模式.

表现用于各种数据类型决定JSON 解析的上下文.

解析器和支持的格式

严格模式输入

下面可以解析在严格模式下类型信息的识别.

  • REST 接口

  • mongoimport

  • 各种 MongoDB 工具的 --query

其他JSON解析器,包含 mongo shell 和 db.eval(), 可以识别严格模式表示为键/值对, 但是没有识别类型信息.

mongo Shell模式输入

下面可以解析在 mongo shell 模式下识别类型信息.

  • REST 接口

  • mongoimport

  • 各种 MongoDB 工具的 --query

  • mongo shell

严格模式输出

mongoexport and REST 和 HTTP 接口 在严格模式下输出数据.

mongo Shell模式输出

bsondump 在 mongo Shell 模式输出.

BSON 数据类型和有关表现

下面介绍 BSON 数据类型和在严格模式和 mongo Shell 模式下有关表现.

二进制

data_binary

Strict Modemongo Shell Mode
{ "$binary": "<bindata>", "$type": "<t>" }BinData ( <t>, <bindata> )
  • <bindata> 是一个二进制字符串的base64的表现形式.

  • <t> 是单个字节表明数据类型的表现形式. 在严格模式下, 它是一个十六进制字符串, 并且在 Shell 模式它是一个整数. 查阅BSON扩展文档. http://bsonspec.org/spec.html

Date

data_date

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

在严格模式下, <date> 是一种ISO 8601的日期格式, 带着必需的遵循以下格式的(YYYY-MM-DDTHH:mm:ss.mmm<+/-Offset>) 的时区字段.

MongoDB JSON 解析器当前不支持加载 ISO-8601 字符串, 表示Unix纪元之前的日期. 当格式化纪元之前的日期和过去的日期, 你的系统的 time_t 类型可以存在, 使用以下格式:

{ "$date" : { "$numberLong" : "<dateAsMilliseconds>" } }

在 Shell 模式下, <date> 是JSON表示的一个64位有符号整数,赋予了自纪元UTC之后毫秒数.

Timestamp

data_timestamp

严格模式mongo Shell 模式
{ "$timestamp": { "t": <t>, "i": <i> } }Timestamp( <t>, <i> )
  • <t> 是一个JSON表现的自纪元到现在的32位无符号的总秒数.

  • <i> 是一个一直增长的32位无符号整数.

正则表达式

data_regex

严格模式mongo Shell 模式
{ "$regex": "<sRegex>", "$options": "<sOptions>" }/<jRegex>/<jOptions>
  • <sRegex> 是一个有效的JSON字符串.

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

  • <sOptions> 是一个字符串包含使用字母表中的字母来表示正则表达式选项.

  • <jOptions> 是一个可能只包含‘g’, ‘i’, ‘m’ and ‘s’等的字符串( 版本1.9新增).

  • <jOptions> 是一个可能只包含‘g’, ‘i’, ‘m’ and ‘s’等的字符串( 版本1.9新增). 因为 JavaScriptmongo Shell 支持一个范围限制选项, 当转换为这种表示方法的时候,任何不合格的选项都将会被丢弃.

OID

data_oid

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

<id> 是一个24个字符的16进制字符串.

DB Reference

data_ref

严格模式mongo Shell 模式
{ "$ref": "<name>", "$id": "<id>" }DBRef("<name>", "<id>")
  • <name> 是一个有效的JSON字符串.

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

Undefined 类型

data_undefined

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

JavaScript/BSON undefined 类型的表现.

你不能在文档查询中使用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 } } )

这个查询返回所有age字段的值为undefined的文档.

MinKey

data_minkey

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

BSON数据类型 MinKey 的表现是相比之下,小于其它所有类型. 在BSON类型比较排序上查阅比较/排序 顺序的更多信息..

MaxKey

data_maxkey

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

BSON数据类型 MaxKey 的表现是相比之下,大于其它所有类型. 在BSON类型比较排序上查阅比较/排序 顺序的更多信息.

NumberLong

版本2.6新功能

data_numberlong

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

NumberLong是一个64位有符号整数。你必须包含括号,否则将会被解释为浮点数,导致准确性的损失。

例如,下列命令是把带括号和不带括号的整数值9223372036854775807作为一个NumberLong来插入:

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

当你检索文档的时候,未加引号的值已经发生了改变,加引号保证了其的准确性:

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

下一章:https://segmentfault.com/a/11...
原文来源:https://docs.mongodb.com/manu...


http://www.niftyadmin.cn/n/2752959.html

相关文章

numpy.ndarray指定每个元素保留小数点后多少位---np.around

问题 我在采用round处理一个np.ndarray数组时&#xff0c;报出一个错误&#xff1a; TypeError: type numpy.ndarray doesnt define __round__ method解决 采用numpy.around()函数&#xff0c;它类似于Python原生的round()函数。 numpy.around参数说明 numpy.around(a, de…

ASP.NET Core 2 学习笔记(七)路由

原文:ASP.NET Core 2 学习笔记&#xff08;七&#xff09;路由ASP.NET Core通过路由(Routing)设定&#xff0c;将定义的URL规则找到相对应行为&#xff1b;当使用者Request的URL满足特定规则条件时&#xff0c;则自动对应到相符合的行为处理。从ASP.NET就已经存在的架构&#x…

Python 生成一段随机字符串的三种写法

方法1 s1.join(random.choice(string.ascii_letters string.digits) for _ in range(10**7))方法2 for _ in range(10**7):s2 random.choice(string.ascii_letters string.digits)方法3 s3.join(random.choices(string.ascii_letters string.digits, k10**7))运行时间对…

quartz做集群配置较短的时间间隔会重复执行任务的问题

quartz.properties org.quartz.jobStore.misfireThreshold 60000 这个参数&#xff08;单位为毫秒&#xff09;设置了以后就是超时1min的就不执行&#xff0c;小于1min会立即执行&#xff0c;当设置15s的情况下&#xff0c;如果我在10:00:00执行了一个任务&#xff0c;下次就是…

Centos 6.5安装mysql

转载自&#xff1a;https://www.cnblogs.com/leffss/p/8512773.html 一&#xff0e;安装前准备 安装采用二进制包方式&#xff0c;软件包5.7.19版本下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择MYSQL Community Server版本再根据操作系统和版本选择性下载…

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 问题解决办法之一

问题描述 Windows下使用Python写文件的时候&#xff0c;或者将网络数据流写入到本地文件的时候&#xff0c;大部分情况下会遇到下面问题&#xff1a; UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xa0’ in position … 解决办法 网络数据流写入文件时&am…

【并查集】【P1525】关押罪犯

传送门 Description Input Output Sample Input 4 6 1 4 2534 2 3 3512 1 2 28351 1 3 6618 2 4 1805 3 4 12884 Sample Output 3512 Hint Solution 非常显然的并查集题目&#xff0c;在本题中&#xff0c;对于每个罪犯i&#xff0c;维护两个信息&#xff1a;必须要和他关在一起…

Python 十进制转换为二进制 高位补零

这里需要使用内置函数.format() 高位补零 >>> a 2 >>> b {:08b}.format(a)输出结果为八位二进制&#xff0c;且高位补零。 高位不补零 >>> b {:8b}.format(a)输出结果为八位二进制&#xff0c;但是高位不补零。 需要注意的是&#xff0c;输…