2016-08-18 1 views
0

Ich arbeite an einem Admin-System für die Verwaltung von Kursen und deren Tutorials.Verwandte Dokumente abfragen

Lasst uns sagen, ich habe folgende Schemata:

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' }] 
}); 

Jeder Kurs hat einen Namen z.B. Einführung in die Web-Programmierung und ein eindeutiger Code z.B. CSCC09. Jedes Tutorial hat eine nicht eindeutige Nummer, z. 0001. Zwei Kurse haben Tutorials mit der gleichen Nummer. Jedes Tutorial in einem Kurs hat jedoch eine andere Nummer.

Derzeit, wenn der Benutzer ein Tutorial zu bearbeiten geht, geht es durch die folgende Route:

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

Der Grund, warum ich es tue diese Art und Weise ist, um sicherzustellen, dass das angepasste Tutorial für den entsprechenden Kurs.

Also, für meine Frage, gibt es eine sauberere Möglichkeit, verwandte Modelle abzufragen?

Ich würde es vorziehen, so etwas wie unten zu tun, aber ich kann nicht, weil das Tutorial, das nicht sein kann, das für den jeweiligen Kurs abgestimmt ist:

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

Ich bin mir bewusst, dass ich die IDs der Dokumente verwenden kann, Ich suche jedoch nach lesbaren URLs (damit Benutzer schnell zu den Seiten aus der URL-Leiste des Browsers gelangen können).

Antwort

-1

Sie sollten die Mungo-Beziehung Bibliothek verwenden. Es macht es einfacher.

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