поддокумент с разными схемами

Я новичок в 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>
});

Конечно, это не совсем правильный код, но я надеюсь, что он прояснит мою проблему:

Каждый элемент списка дел должен содержать ровно одну задачу. Существует ограниченный, хорошо известный список возможных задач, и каждая из них имеет очень специфические свойства/схему (в моем приложении эти вложенные документы были бы намного сложнее).

Насколько я знаю, это невозможно решить с помощью [вложенных документов], потому что я могу назначить только один тип вложенного документа для каждого поля. В любом случае мне нужен ровно один поддокумент, а не список.

Альтернативой может быть что-то вроде этого:

var todoSchema = new Schema({
  due: Date,
  created: Date,

  hairCutTask: haitCutSchema,
  paintWallTask: paintWallSchema,
  napTask: napSchema
});

Однако таким образом схема не помешает мне объявить hairCutTask и napTask одновременно - и, вероятно, обязательные поля вложенного документа в любом случае сделают каждый из трех требуемых типов.


Как лучше всего структурировать такие данные и как должна выглядеть схема?


person Udo G    schedule 09.09.2016    source источник
comment
Насколько я знаю, это невозможно решить с помощью [вложенных документов], потому что я могу назначить только один тип вложенного документа для каждого поля. -- вы можете заглянуть в Schema.Types.Mixed для этого (не так полезно, как создание фактической ссылки на элемент коллекции)   -  person the holla    schedule 10.09.2016
comment
Такой смешанный тип схемы не помешает мне хранить что-то бессмысленное, не соответствующее ни одной из схем задач, верно?   -  person Udo G    schedule 10.09.2016


Ответы (1)


«дискриминаторы», вероятно, то, что я ищу:

person Udo G    schedule 10.09.2016