2016-04-23 8 views
0

node.jsのmongooseと関連してmongodbを使用しています。mongodb/mongoose:拡張可能な列挙型データをモデル化する方法

{ 
"_id": "AAA", 
"_userId": "BBB", 
"task": "Meeting with Bob", 
"startTime": "2016-04-12T06:00:00.000Z", 
"endTime": "2016-04-12T08:30:00.000Z", 
"category" : "meeting" 
} 

カテゴリの私が持っているオプション:今、私は、データが次のようになりますようにCalEventに「カテゴリ」プロパティを追加したい

var calEventSchema = mongoose.Schema({ 
"_userId" : { type: mongoose.Schema.Types.ObjectId, ref: 'PanelUser' }, 
"task" : String, 
"startTime" : Date, 
"endTime" : Date 
}); 
exports.CalEvent = mongoose.model('CalEvent', calEventSchema); 

:私は、単純なコレクションのスキーマを次しています「会議」、「休暇」、「公務員」、「オフサイト」などがあります。ユーザーがイベントを作成するときは、すべてのカテゴリオプションを選択する必要があります(たとえば、ドロップダウン)。さらに、パワーユーザーはカテゴリを拡張できる必要があります。

私はそれを行うにはいくつかの方法について考えますがどちらかと私は満足していない:

  1. はちょうどCalEvents'カテゴリーを保存するために(しかしCalEventスキーマがちょうど値を考慮することを確認する方法を別のコレクションを作成します。カテゴリコレクションにリストされていますか?)
  2. それはリレーショナルなやり方をします:1のような独自のコレクションを作成し、_idのカテゴリをCalEventsの_catIdフィールドに照会します。これは何とか私がリレーショナルテーブル何とか間違っているように感じます。

これを行うより良い方法はありますか?

答えて

0

通常、固定列挙値の場合は、enumを使用してこの問題を解決できます。

、あなたのモデルは次のように次のようになります。

var calEventSchema = mongoose.Schema({ 
    "_userId" : { type: mongoose.Schema.Types.ObjectId, ref: 'PanelUser' }, 
    "task" : String, 
    "startTime" : Date, 
    "endTime" : Date, 
    "category:{ 
     type: String, 
     default: 'meeting', // if you want to set as default value 
     enum:['meeting', 'vacations', 'civil service', 'offsite'] 
    } 
}); 
exports.CalEvent = mongoose.model('CalEvent', calEventSchema); 

しかし、あなたはにしたい場合は、その後、より良いcategoryのために別のモデルを作成し、選択したカテゴリを参照し、を拡張したりcategoryオプション動的を減らしますlike _userId

+0

はい、カテゴリを拡張する必要がある場合、これ以上エレガントなオプションはないようです実行時に実行できるように、私は別のモデルとして実装しました..カテゴリが静的であれば、この例で示したようにエレガントになります – risuch

関連する問題