Я новичок в 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>
});
Конечно, это не совсем правильный код, но я надеюсь, что это делает моя проблема ясна:
Каждый элемент TODO должен содержать ровно один задачу. Существует ограниченный, хорошо известный список возможных задач, и каждый из них имеет очень специфические свойства/schema (в моем приложении эти вложенные документы были бы более сложными).
AFAIK это невозможно решить, используя [вложенные документы], потому что я могу назначить один тип поддокумента для каждого поля. В любом случае мне нужен ровно один поддокумент, а не список.
Альтернативой может быть что-то вроде этого:
var todoSchema = new Schema({
due: Date,
created: Date,
hairCutTask: haitCutSchema,
paintWallTask: paintWallSchema,
napTask: napSchema
});
Однако, таким образом схема не помешает мне объявить hairCutTask
и napTask
в то же время - и, вероятно, необходимые поля поддокументе бы каждый трех типов, необходимых в любом случае.
Что такое хороший способ структурирования таких данных и как должна выглядеть схема?
«AFAIK это невозможно решить с помощью [subdocuments], потому что я могу назначить только один тип поддокумента для каждого поля». - вы можете посмотреть в Schema.Types.Mixed для этого (не так полезно, как создание фактической ссылки на элемент коллекции) –
Такой тип «смешанной» схемы не помешает мне хранить что-то бессмысленное, не соответствующее какой-либо задаче схемы, правильно? –