JSON 转 Mongoose Schema

即时从 JSON 生成 Mongoose Schema,支持 JavaScript 和 TypeScript 输出、timestamps 选项、嵌套对象和数组。免费,在浏览器中运行。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
设置模型和根 schema 的名称。留空时使用 User。建议使用 User、Order 等简单名称。
语言 JavaScript 使用 CommonJS require 和 module.exports;TypeScript 使用 import/export,并将文档接口传给 Schema 和 model。
timestamps 开启时为根 schema 添加 timestamps: true。TypeScript 还会补充 Date 类型的 createdAt 和 updatedAt;JSON 已有同名键时保留原类型。
必填字段 开启时为基本类型、日期、Mixed 和基本类型数组字段添加 required: true。嵌套 schema 和对象数组保持原形式。
用含嵌套对象和数组的用户文档替换 JSON,并按当前模型名称及选项立即生成。
清空 JSON、输出和状态,保留模型名称及选项。在工具内按 Ctrl/⌘+L 还会清空模型名称。
输入合法 JSON。修改输入或模型名称后等待 300 毫秒生成,三个选项组会立即更新。JSON 无效时清空输出并禁用复制。
Mongoose Schema 输出
复制显示的完整 schema 和 model 导出语句。输出为空时禁用复制。

输入 JSON 或载入示例以生成 Mongoose schema。

示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

类型映射

  • null 可放入任何类型,推断时跳过;所有样例都是 null 的字段 → mongoose.Schema.Types.Mixed
  • 各样例类型不同的字段(数字和字符串、对象和字符串)→ mongoose.Schema.Types.Mixed;ISO 日期时间与其他字符串混在一起 → String
  • 字符串 → String
  • 数字 → Number
  • 布尔值 → Boolean
  • 基本类型数组 → [String] / [Number] / [Boolean]
  • 对象数组 → [subSchema](生成独立子 schema)
  • 嵌套对象 → 独立 schema 变量,内联引用

示例

给定如下 JSON,模型名称为 User:

{"username": "alice", "age": 28, "tags": ["admin"], "address": {"city": "London"}}

JavaScript 输出(timestamps 开启):

const mongoose = require('mongoose');
const { Schema } = mongoose;

const addressSchema = new Schema({
  city: { type: String },
});

const userSchema = new Schema({
  username: { type: String },
  age: { type: Number },
  tags: [String],
  address: addressSchema,
}, { timestamps: true });

module.exports = mongoose.model('User', userSchema);

示例:每个样例都参与类型推断

根数组含两条订单,模型名称为 Order,JavaScript,timestamps 关闭:

[{"code":1,"note":null,"seller":{"meta":{"x":1}},"buyer":{"meta":{"y":"2"}}},{"code":"A-2","note":"gift","tags":["a",1]}]

输出:

const mongoose = require('mongoose');
const { Schema } = mongoose;

const metaSchema = new Schema({
x: { type: Number },
});

const sellerSchema = new Schema({
meta: metaSchema,
});

const buyerMetaSchema = new Schema({
y: { type: String },
});

const buyerSchema = new Schema({
meta: buyerMetaSchema,
});

const orderSchema = new Schema({
code: { type: mongoose.Schema.Types.Mixed },
note: { type: String },
seller: sellerSchema,
buyer: buyerSchema,
tags: [mongoose.Schema.Types.Mixed],
}, { timestamps: false });

module.exports = mongoose.model('Order', orderSchema);
  • code 一条是 1、另一条是 “A-2”,所以是 Mixed;写成 Number 会拒绝 “A-2”。note 一条是 null、一条是 “gift”,所以是 String。tags 里有字符串也有数字,元素为 Mixed。
  • 两个 meta 对象字段不同,第二个用父级 key 作前缀(buyerMetaSchema)。同一个 key 下字段和类型都相同的对象共用一个 schema;加前缀后仍重名时再加数字。
  • Mixed 字段不做类型转换和校验,内部改动要调用 markModified() Mongoose 才会保存。数据允许时请改成一种类型。

工具的测试用 Mongoose 9.10.3 运行生成的 JavaScript,用每个样例创建文档,确认 validateSync() 通过、所有字段和值都保留(ISO 日期时间以 Date 保存,按 toISOString() 形式比较;样例里没有的数组字段会得到 Mongoose 的默认值 [])。

FAQ

这个工具生成什么?

从 JSON 生成 Mongoose schema 定义。每个嵌套对象都会生成独立的 schema 变量,底部包含 model 导出语句。

支持哪些语言模式?

JavaScript(CommonJS require/module.exports)和 TypeScript(ES module import/export)。TypeScript 输出按 Mongoose TypeScript 指南的写法,生成普通的文档接口并传给 Schema<T> 与 model<T>,不继承 Document。

JSON 类型如何映射到 Mongoose 类型?

string→String、number→Number、boolean→Boolean、所有样例都为 null 时→mongoose.Schema.Types.Mixed、各样例类型不同时→Mixed、基本类型数组→[Type]、对象数组→独立子 schema、嵌套对象→独立子 schema。

timestamps 选项有什么作用?

开启时,schema 会以 { timestamps: true } 创建,Mongoose 将自动管理 createdAt 和 updatedAt 字段(类型为 Date)。TypeScript 模式下接口也会列出 createdAt: Date 与 updatedAt: Date,hydrated 文档与 .lean() 结果都能直接读取;JSON 根对象已有同名键时保留它自己的类型。

所有字段都会标记为必填吗?

不会。仅凭 JSON 无法判断字段是否必填,默认不添加 required: true。打开「必填字段」开关会给所有非嵌套字段加上 required: true(嵌套 Schema 与对象数组除外),之后再按实际删改。

我的数据会发送到服务器吗?

不会。整个转换在浏览器中运行,数据不会离开本机。