具有不同模式的子文档

时间:2016-09-09 16:10:40

标签: mongoose mongoose-schema

我是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
});

但是,通过这种方式,架构不会阻止我同时声明hairCutTasknapTask - 并且可能所需的子文档字段会使每个无论如何都需要三种类型。

构建此类数据的好方法是什么?架构应该如何?

2 个答案:

答案 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,
});