Mongoose Enum 使い方解説
Mongoose で Enum を作成して使用する方法
Mongoose は、Node.js アプリケーションで MongoDB と対話するためのオブジェクト指向モデリングツールです。Enum(列挙型)を使用すると、特定のフィールドの値を制限し、データの整合性を確保することができます。
Enum の作成と使用
-
Schema の定義
Schema.Types.Enum
を使用して列挙型を定義します。- 各列挙値は文字列または数値で指定されます。
const mongoose = require('mongoose'); const mySchema = new mongoose.Schema({ status: { type: String, enum: ['active', 'inactive', 'pending'], required: true } });
-
モデルの作成
mongoose.model
を使用してモデルを作成します。
const MyModel = mongoose.model('MyModel', mySchema);
-
データの保存
- モデルのインスタンスを作成し、Enum フィールドに有効な値を設定します。
const newDocument = new MyModel({ status: 'active' }); newDocument.save().then(doc => { console.log('Document saved:', doc); });
Enum の利点
- エラーの防止
Enum を使用することで、不正な値がデータベースに保存されるのを防ぐことができます。 - コードの可読性
Enum を使用すると、コードがより読みやすく理解しやすくなります。 - データの整合性
Enum を使用することで、フィールドの値が指定された選択肢のいずれかであることを保証できます。
注意事項
- Enum フィールドに不正な値を設定すると、エラーが発生します。
- Enum フィールドは
required
オプションを使用して必須にすることができます。 - Enum の値は文字列または数値で指定する必要があります。
例
const mongoose = require('mongoose');
const mySchema = new mongoose.Schema({
color: {
type: String,
enum: ['red', 'green', 'blue'],
required: true
}
});
const MyModel = mongoose.model('MyModel', mySchema);
// 正しい値を設定
const newDocument1 = new MyModel({
color: 'red'
});
// 不正な値を設定
const newDocument2 = new MyModel({
color: 'purple'
}); // エラーが発生します
例
const mongoose = require('mongoose');
// Schema の定義
const mySchema = new mongoose.Schema({
status: {
type: String,
enum: ['active', 'inactive', 'pending'],
required: true
},
color: {
type: String,
enum: ['red', 'green', 'blue'],
default: 'blue'
}
});
// モデルの作成
const MyModel = mongoose.model('MyModel', mySchema);
// データの保存
const newDocument = new MyModel({
status: 'active',
color: 'red'
});
newDocument.save().then(doc => {
console.log('Document saved:', doc);
});
コードの説明
- モジュールのインポート
mongoose
モジュールをインポートします。 - Schema の定義
mySchema
という名前の Schema を定義します。status
フィールド: 文字列型で、active
,inactive
,pending
のいずれかの値を指定する必要があります。color
フィールド: 文字列型で、red
,green
,blue
のいずれかの値を指定できます。デフォルト値はblue
です。
- モデルの作成
MyModel
という名前のモデルを作成します。 - データの保存
newDocument
という名前の新しいドキュメントを作成し、status
フィールドにactive
、color
フィールドにred
の値を設定します。 - ドキュメントの保存
save()
メソッドを使用してドキュメントをデータベースに保存します。
Enum の使い方
default
オプションを使用して、フィールドのデフォルト値を設定します。required
オプションを使用して、フィールドを必須にします。enum
オプションを使用して、フィールドの値を制限します。
代替方法
Mongoose で Enum を作成して使用する方法には、いくつかの代替方法があります。
Number Enum
- 通常、数値は列挙値のインデックスとして使用されます。
- 文字列ではなく数値を使用して Enum を定義します。
const mySchema = new mongoose.Schema({
status: {
type: Number,
enum: [0, 1, 2] // 0: active, 1: inactive, 2: pending
}
});
Embedded Document
- 柔軟性が高く、複雑な列挙値を定義できます。
- Enum の値を別のドキュメントとして埋め込みます。
const statusSchema = new mongoose.Schema({
name: String
});
const mySchema = new mongoose.Schema({
status: {
type: statusSchema
}
});
Virtual Properties
- データベースに保存されず、読み取り専用です。
- Enum の値を仮想プロパティとして定義します。
const mySchema = new mongoose.Schema({
statusNumber: {
type: Number
}
});
mySchema.virtual('status').get(function() {
switch (this.statusNumber) {
case 0: return 'active';
case 1: return 'inactive';
case 2: return 'pending';
default: return 'unknown';
}
});
Custom Validation
- 柔軟性が高く、任意の条件を指定できます。
- カスタムバリデーション関数を使用して Enum の値を検証します。
const mySchema = new mongoose.Schema({
status: {
type: String
}
});
mySchema.path('status').validate(function(value) {
return ['active', 'inactive', 'pending'].includes(value);
}, 'Invalid status');
選択する適切な方法
- 読み取り専用の列挙値
Virtual Properties が適しています。 - 複雑な列挙値
Embedded Document またはカスタムバリデーションが適しています。 - シンプルで静的な列挙値
Number Enum または文字列 Enum が適しています。
node.js mongodb express