2016-08-18 3 views
0

Я работаю над административной системой для управления курсами и их учебными пособиями.Запрос связанных документов

Скажем, у меня есть следующие схемы:

var TutorialSchema = new mongoose.Schema({ 
    number: { type: String, required: true } 
}); 

var CourseSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    code: { type: String, required: true, unique: true }, 
    tutorials: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tutorial' }] 
}); 

Каждый курс имеет имя, например, Введение в веб-программирование и уникальный код, например. CSCC09. В каждом учебнике есть неуникальный номер, например. 0001. На двух курсах будут обучаться те же номера. Однако каждый учебник в курсе будет иметь другое число.

В настоящее время, когда пользователь переходит редактировать учебник, он идет по следующему маршруту:

router.get('/courses/:code/tutorials/:number/edit', function (req, res) { 
    Course.findOne({ 
     code: req.params.code 
    }).populate({ 
     path: 'tutorials', match: { number: req.params.number } 
    }).exec(function (err, course) { 
     res.render('admin/tutorial', { course: course, tutorial: course.tutorials[0], method: 'put' }); 
    }); 
}); 

Причина, почему я делаю это таким образом, чтобы гарантировать, что учебник соответствует для соответствующего курса.

Итак, для моего вопроса есть ли более простой способ запроса связанных моделей?

Я бы предпочел, чтобы сделать что-то вроде ниже, но я не могу, потому что учебник, который подобран не может быть для соответствующего курса:

Course.findOne({ code: req.params.code}, function (err, course) { 
    Tutorial.findOne({ number: req.params.number }, function (err, tutorial) { 
     // ... 
    }); 
}); 

Я знаю, что я могу использовать идентификаторы документов, однако я ищу, чтобы иметь читаемые URL-адреса (чтобы пользователи могли быстро перейти на страницы из строки URL-адреса браузера).

ответ

-1

Вы должны использовать библиотеку отношений с мангустами. Это делает его более легким.

var mongoose = require("mongoose"), 
    Schema = mongoose.Schema, 
    relationship = require("mongoose-relationship"); 

    var ParentSchema = new Schema({ 
     children:[{ type:Schema.ObjectId, ref:"Child" }] 
    }); 
    var Parent = mongoose.model("Parent", ParentSchema); 

    var ChildSchema = new Schema({ 
     parent: { type:Schema.ObjectId, ref:"Parent", childPath:"children" } 
    }); 
    ChildSchema.plugin(relationship, { relationshipPathName:'parent'}); 
    var Child = mongoose.model("Child", ChildSchema) 

    var parent = new Parent({}); 
    parent.save(); 
    var child = new Child({parent:parent._id}); 
    child.save() //the parent children property will now contain child's id 
    child.remove() //the parent children property will no longer contain the child's id