数据建模:JSON To Mongoose模式 — Numio
根据 JSON 示例文档推断 Mongoose schema 定义,并以 JSON 输出。字段类型为 String、Number、Boolean、Date、ObjectId 或 Mixed;嵌套对象变为嵌套路径,对象数组变为子文档 schema。
根据从 Compass 或 mongosh 复制的文档,为现有 MongoDB 集合编写 schema。
JSON
Mongoose Schema
适用场景
- 根据从 Compass 或 mongosh 复制的文档,为现有 MongoDB 集合编写 schema。
- 根据准备存储的示例 API 载荷开始编写 Node.js 模型。
使用方法
- 以严格 JSON 粘贴一个文档或文档数组;ObjectId 和日期请写成普通字符串,而不是 ObjectId() 或 ISODate()。
- 检查推断的类型:24 位十六进制字符串变为 ObjectId,2024-05-01T08:00:00Z 这样的 ISO 8601 字符串变为 Date。
- 把结果复制到 new mongoose.Schema({...}) 中,并自行添加 required、default、index 和 ref 选项。
JSON 文档
{
"_id": "64f1c2a9e1b2c3d4e5f60718",
"name": "Ada Lovelace",
"code": "A-1001",
"joinedAt": "2024-05-01T08:00:00Z",
"roles": ["admin", "editor"],
"addresses": [
{ "city": "London", "zip": "NW1" },
{ "city": "Paris", "zip": "75001", "primary": true }
],
"profile": { "bio": "Mathematician", "website": null }
}Mongoose schema(JSON)
{
"_id": {
"type": "ObjectId"
},
"name": {
"type": "String"
},
"code": {
"type": "String"
},
"joinedAt": {
"type": "Date"
},
"roles": {
"type": [
"String"
]
},
"addresses": {
"type": [
{
"city": {
"type": "String"
},
…功能与限制
在浏览器中由本站自己的生成器推断,文档不会发送到服务器。
只有 ISO 8601 日期(2024-05-01,可带时间和时区偏移)会定为 Date,因此 "A-1001" 或 "12" 这样的编码仍为 String。
对象数组变为由所有元素构建的子文档 schema,例如 "type": [{ "city": ... }]。空数组变为 Array,null 变为 Mixed。
必填字段、默认值、索引和 ref 无法从数据推断;示例中没有的字段也不会出现在 schema 中。
FAQ
能转换 JSON 文档数组吗?
能。文档会被合并,任一文档中出现的字段都会进入 schema。在不同文档中类型不同的字段变为 Mixed。
为什么类型带引号,比如 "String"?
输出是 JSON,所以类型名是字符串。在 JavaScript 中可以使用全局构造函数 String、Number、Boolean、Date,以及 Schema.Types.ObjectId 和 Schema.Types.Mixed。
_id 如何处理?
与其他字段相同:24 位十六进制字符串定为 ObjectId。如果希望 Mongoose 自动添加 _id,请删除它。