2016-04-23 120 views
0

我在node.js中使用与mongoose相关的mongodb。我有以下简单的收集模式:mongodb/mongoose:如何建模可扩展的类枚举数据

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

现在我想将“类别”属性,以使数据看起来像这样添加到CalEvent:

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

的选项我的类别可能是['会议','休假','公务员','非现场']。当用户创建一个事件时,他应该得到所有的类别选项(例如下拉菜单)。更多:高级用户应该能够扩展类别。

我想到了一些方法来做到这一点,但我不开心或者:

  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和参考选定的类别像_userId

+0

是的,似乎没有更优雅的选择,如果类别应扩展能够在运行时,我将它作为另一个模型实现。如果类别是静态的,那么就像在示例中显示的那样,它会很优雅 – risuch