2016-09-09 2 views
0

Я новичок в 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 в то же время - и, вероятно, необходимые поля поддокументе бы каждый трех типов, необходимых в любом случае.

Что такое хороший способ структурирования таких данных и как должна выглядеть схема?

+0

«AFAIK это невозможно решить с помощью [subdocuments], потому что я могу назначить только один тип поддокумента для каждого поля». - вы можете посмотреть в Schema.Types.Mixed для этого (не так полезно, как создание фактической ссылки на элемент коллекции) –

+0

Такой тип «смешанной» схемы не помешает мне хранить что-то бессмысленное, не соответствующее какой-либо задаче схемы, правильно? –

ответ

0

Из того, как это было описано, я не вижу большого значения в отдельной схеме TODO. Вместо этого, эта информация может быть включена с каждой задачей:

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

Вы все еще можете легко найти задачи по типу:

napSchema.find({ pillows: 2 }, function(err, napTasks) { 
    // ... 
}); 
+0

Хорошо, но тогда я теряю способность легко перечислять все предметы todo (независимо от типа), и у меня нет единственного уникального _id для каждого элемента todo - или я чего-то не хватает? –

+0

Да, таким образом вам нужно будет делать отдельные запросы для каждого вида задач. Каждый элемент будет иметь уникальный _id, но не как часть схемы Task/to-do. Я нашел это описание наследования в Mongoose, которое может быть тем, что вы ищете: https://github.com/Automattic/mongoose/pull/1647 –

Смежные вопросы