mongodb / mongoose:如何建模可扩展的枚举数据

时间:2016-04-23 12:51:00

标签: node.js mongodb mongoose

我在node.js中使用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添加一个'category'属性,以便数据看起来像这样:

{
"_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,这看起来就像我用关系表做的那样,并且感觉有些不对。
  3. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,如果修复枚举值,则可以使用upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int child=listView.getChildCount(); for(int i=0;i<child;i++) { View rgg=listView.getChildAt(i); radioGroup = (RadioGroup) rgg.findViewById(R.id.radio); int selectedId=radioGroup.getCheckedRadioButtonId(); radioButton = (RadioButton) rgg.findViewById(selectedId); } } }); 解决此问题。

然后你的模型就像:

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