跳到主要内容

数据建模: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 模型。

使用方法

  1. 以严格 JSON 粘贴一个文档或文档数组;ObjectId 和日期请写成普通字符串,而不是 ObjectId() 或 ISODate()。
  2. 检查推断的类型:24 位十六进制字符串变为 ObjectId,2024-05-01T08:00:00Z 这样的 ISO 8601 字符串变为 Date。
  3. 把结果复制到 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,请删除它。

规范与参考资料