本文へスキップ

JSONからMongooseスキーマへの変換器 — Numio

サンプルの JSON ドキュメントから Mongoose のスキーマ定義を推定し、JSON で出力します。フィールドの型は String、Number、Boolean、Date、ObjectId、Mixed のいずれかになり、ネストしたオブジェクトはネストしたパス、オブジェクトの配列はサブドキュメントのスキーマになります。

Compass や mongosh からコピーしたドキュメントをもとに、既存の MongoDB コレクションのスキーマを書く。

JSON

Mongoose Schema

こんなときに使えます

  • Compass や mongosh からコピーしたドキュメントをもとに、既存の MongoDB コレクションのスキーマを書く。
  • 保存する予定のサンプル API ペイロードから Node.js のモデルを書き始める。

使い方

  1. ドキュメントまたはドキュメントの配列を厳密な JSON で貼り付けます。ObjectId や日付は ObjectId() や ISODate() ではなく普通の文字列で書きます。
  2. 推定された型を確認します。24 文字の 16 進文字列は 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 スキーマ(JSON)

{
  "_id": {
    "type": "ObjectId"
  },
  "name": {
    "type": "String"
  },
  "code": {
    "type": "String"
  },
  "joinedAt": {
    "type": "Date"
  },
  "roles": {
    "type": [
      "String"
    ]
  },
  "addresses": {
    "type": [
      {
        "city": {
          "type": "String"
        },
…

仕様と制限

サイト独自のジェネレーターがブラウザ内で推定し、ドキュメントはサーバーに送信されません。

Date になるのは ISO 8601 の日付(2024-05-01、時刻とオフセットは任意)だけなので、"A-1001" や "12" のようなコードは String のままです。

オブジェクトの配列は、"type": [{ "city": ... }] のように全要素から組み立てたサブドキュメントのスキーマになります。空配列は Array、null は Mixed になります。

必須項目、デフォルト値、インデックス、ref はデータから推定できず、サンプルにないフィールドはスキーマにも含まれません。

FAQ

ドキュメントの JSON 配列も変換できますか?

できます。ドキュメントはマージされ、いずれかに現れるフィールドはすべてスキーマに入ります。ドキュメントによって型が異なるフィールドは Mixed になります。

"String" のように型が引用符付きなのはなぜですか?

出力が JSON なので、型名は文字列になります。JavaScript ではグローバルのコンストラクター String、Number、Boolean、Date と、Schema.Types.ObjectId、Schema.Types.Mixed を使えます。

_id はどう扱われますか?

他のフィールドと同じで、24 文字の 16 進文字列なら ObjectId になります。Mongoose に自動で追加させたい場合は _id を削除してください。

仕様を確認する