数据库与 SQL

MongoDB 扩展 JSON看清类型再转换

粘贴严格 EJSON,切换标准或宽松表示,检查保真提示后导出。

MongoDB 扩展 JSON

解析 ObjectId

EJSON 输入

JSON 结果

文本仅在当前浏览器处理,不连接数据库、不上传文档。

输出与解释方式

仅接受一个严格 JSON 值;拒绝 Shell 表达式、注释和重复键。

裸整数按范围推断为 Int32 或 Int64,小数或指数形式推断为 Double;普通字符串不猜类型。

上限:输入 500,000 个 UTF-16 单元,深度 100 层,50,000 个节点,输出 2,000,000 个字符。

输入或参数已改变,请转换后再导出。

MongoDB 扩展 JSON 常见于数据库导出和接口调试。文档里的 $oid、$date 或 $numberDecimal 不是多余装饰,直接删掉它们,会改变接收方能够还原的数据类型。

先用示例比较两种输出。特意放入的大整数能帮助你区分“数字没有少一位”和“原来的 BSON 类型仍然存在”。转换时原输入始终保留,方便检查日期、金额与标识符。

为什么使用 MongoDB 扩展 JSON

先检查表示方式,再把文档交给下一个系统。

分清类型包装与普通字段

MongoDB 扩展 JSON 默认选择 Canonical EJSON。切换 Relaxed EJSON 后,有限数值和适用日期变得简洁,ObjectId 与 Decimal128 仍保留包装。你可以同时对照原文与结果,不必猜测哪些字段发生了变化。

三行类型数据中,数值包装展开,标识符与小数包装保持完整

保留整数的每一位

9007199254740993 这样的 Long 从精确整数直接写出,不经普通 Number 中转。宽松结果中的数字仍然完整,但接收方若使用 JavaScript 默认解析器,仍可能舍入;保真提示会说明这个区别。

完整数位方块穿过文档边界,接收端旁有警示符号

选对接收方需要的表示

01

确认粘贴的是数据文本

文档、数组或单个标量都可以输入。ObjectId() 和 ISODate() 是 Shell 表达式,需先导出为带 $oid、$date 的严格 JSON。

  • 示例和清空会先显示替换预览;应用后可以一次撤销,连同输出一起恢复。
02

切换模式时关注类型

标准模式适合保留明确的数值类型,宽松模式适合阅读。不要只看结果是否更短,要确认 Decimal128、日期和大整数符合下一步使用方式。

  • 模式或缩进一变,旧结果立即停止复制与下载,避免拿走上一次转换的数据。
03

决定何时刷新结果

自动转换在最后一次修改后等待 350 毫秒;关闭开关会取消待执行任务并显示转换按钮。手动模式也支持 Ctrl/Cmd + Enter。

  • 编辑器只显示当前视口,但复制与下载始终包含完整结果。

围绕真实 BSON 类型处理

明确的支持集合

EJSON 转换覆盖 ObjectId、Decimal128、Int32、Int64、Double、日期、Binary、UUID、正则、Timestamp 和 MinKey/MaxKey。UUID 规范化为子类型 04 的二进制包装,正则选项按字母顺序输出,不执行正则匹配。

日期不受普通时间对象截断

标准模式保留有符号 64 位毫秒字符串,包括 JavaScript Date 无法表示的极值。宽松模式仅对 1970 至 9999 年范围输出 UTC 日期字符串,其余日期继续保留毫秒包装,不改成当前时间,也不截断年份。

数值推断规则可检查

不带包装的整数按范围推断为 Int32 或 Int64,小数和指数形式按 Double 处理。Double 遵循二进制 64 位精度,过长十进制写法可能舍入;看起来像日期或标识符的普通字符串不会被自动识别成其他类型。

输入规则与能力边界

严格的 v2 子集
不执行代码,不修复 Shell 语法,不接受旧版 v1、Code/Scope、DBPointer、Undefined 或 Symbol 包装。普通未知字段按原字段保留;一旦识别为类型包装,就必须符合完整结构,不能夹带其他键。
不提供全部去标签
Relaxed 仍是扩展格式,不会删除每一个以美元符号开头的键,也不会把 Decimal128 强转成 Number。输入之前已经失去的数值类型无法恢复,切回标准模式也不能证明它与数据库原值完全一致。
一次只处理一个值
不读取 BSON 二进制、Hex/Base64 容器、mongodump 目录或上传文件,不连接或导入数据库。按行分隔的多个文档不是单个 JSON 值,请逐个处理,或在导出阶段生成数组后再粘贴。
资源和范围上限
输入限制为 500,000 个 UTF-16 单元、100 层嵌套和 50,000 个节点,输出最多 2,000,000 个字符。Int64 溢出、非法日历日期和重复键都会阻止整次转换,不提供看似有效的部分结果。
规范化不等于备份还原
空白、日期拼写和类型包装的表达形式可能变化;Decimal128 与正则遵循官方引擎的规范形式,浮点数遵循二进制精度。结果不会覆盖原输入;后续任何编辑都会使导出失效,直到本次转换成功。

MongoDB 扩展 JSON 常见问题

Canonical 和 Relaxed 有什么区别?

Canonical 优先保存 BSON 类型信息,因此数值也有包装。Relaxed 将有限数值和适用日期写得更容易阅读。两者都是合法 JSON 文本,但 ObjectId、Decimal128 等类型在两种模式中都会保留标签。

能直接粘贴 mongosh 的输出吗?

只有输出本身是严格 JSON/EJSON 时可以。ObjectId("…")、ISODate("…")、NumberLong("…") 都是表达式,会被拒绝。请先用扩展格式导出或序列化文档;本工具不会执行粘贴的代码,也不会用正则猜测并替换它。

为什么 NumberLong 的数字放在字符串里?

标准格式通过字符串形式的 $numberLong 保存每一位数字,防止普通解析器提前舍入。本工具的宽松模式会写出完整整数,而不是给它加引号;但接收方要用支持精确整数的解析方式,尤其是超过安全范围的值。

Decimal128 为什么不能直接改成 number?

常见 JavaScript Number 使用二进制 64 位,精度与 Decimal128 不同。$numberDecimal 的字符串同时保存十进制表示和类型,因此在宽松模式中也保留。金额等要求十进制精度的数据不应随意去掉这层包装。

可以转换整个 mongoexport 文件吗?

可以处理限制内的单个 JSON 值,例如文档数组。默认按行导出的多个文档属于 JSONL,不会被当作一个值接受。请转换单条文档,或者使用合适的导出选项先生成数组;这里没有文件上传或流式处理入口。

发现解析边界问题?

核对类型后再导出

回到 MongoDB 扩展 JSON,选择接收方需要的模式,检查精度提示后再保存结果。