我是Mongoose的新手,我正在努力了解如何正确地宣布结构。
说,我有一个集合todos
,应该包含描述应该做什么的文档。所有TODO项目都有一些共同的属性,但大多数细节取决于具体任务。
// Tasks:
var hairCutSchema = new Schema({
style: {type: String, required:true},
length: Number
});
var paintWallSchema = new Schema({
color: {type: String, required:true},
surface: Number, required:true},
layers: Number
});
let napSchema = new Schema({
duration: {type: Number, required:true},
dream: String,
pillows: Number,
// ....
});
// TODOs (parent document):
var todoSchema = new Schema({
due: Date,
created: Date,
task: <either hairCutSchema, paintWallSchema OR napSchema>
});
当然这不是真正有效的代码,但我希望它能解决我的问题:
每个待办事项都应包含一个任务。有一个有限的,众所周知的可能的任务列表,每个任务都有非常具体的属性 / schema(在我的应用程序中,这些子文档会更复杂)。
AFAIK使用[子文档]无法解决这个问题,因为我只能为每个字段分配一个子文档类型。无论如何,我只需要一个子文档,而不是列表。
替代方案可能是这样的:
var todoSchema = new Schema({
due: Date,
created: Date,
hairCutTask: haitCutSchema,
paintWallTask: paintWallSchema,
napTask: napSchema
});
但是,通过这种方式,架构不会阻止我同时声明hairCutTask
和napTask
- 并且可能所需的子文档字段会使每个无论如何都需要三种类型。
构建此类数据的好方法是什么?架构应该如何?
答案 0 :(得分:1)
“歧视者”可能正是我所寻找的:http://mongoosejs.com/docs/discriminators.html
答案 1 :(得分:0)
从描述的方式来看,我在单独的TODO架构中看不到多少价值。相反,每个任务都可以包含这些信息:
React.createElement
您仍然可以按类型轻松找到任务:
var hairCutSchema = new Schema({
due: Date,
created: Date,
style: { type: String, required: true },
length: Number
});
var paintWallSchema = new Schema({
due: Date,
created: Date,
color: { type: String, required: true },
surface: { Number, required:true },
layers: Number
});
let napSchema = new Schema({
due: Date,
created: Date,
duration: { type: Number, required: true },
dream: String,
pillows: Number,
});