2015-03-16 11 views
6

Ich baue ein Mongoose-Schema für eine Dating-App.Wie referenziere ich ein anderes Schema in meinem Mongoose-Schema?

Ich möchte jedes person Dokument einen Verweis auf alle Ereignisse enthalten, die sie schon einmal gemacht haben, wobei events ein anderes Schema mit eigenen Modellen im System ist. Wie kann ich das im Schema beschreiben?

var personSchema = mongoose.Schema({ 
    firstname: String, 
    lastname: String, 
    email: String, 
    gender: {type: String, enum: ["Male", "Female"]} 
    dob: Date, 
    city: String, 
    interests: [interestsSchema], 
    eventsAttended: ??? 
}); 
+2

So etwas, glaube ich: 'eventsAttended: [{type: app.mongoose.Schema.ObjectId, ref: 'Event'}]' –

Antwort

13

Sie können es beschreiben, indem Population

Population verwendet, ist der Prozess der automatischen Bestimmung der angegebenen Pfade in dem Dokument mit dem Dokument (e) von anderer Sammlung ersetzt (s). Wir möglicherweise ein einzelnes Dokument, mehrere Dokumente, einfaches Objekt, mehrere einfache Objekte oder alle Objekte aus einer Abfrage zurückgegeben.

Angenommen, Ihr Ereignisschema ist wie folgt definiert:

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 

var eventSchema = Schema({ 
    title  : String, 
    location : String, 
    startDate : Date, 
    endDate : Date 
}); 

var personSchema = Schema({ 
    firstname: String, 
    lastname: String, 
    email: String, 
    gender: {type: String, enum: ["Male", "Female"]} 
    dob: Date, 
    city: String, 
    interests: [interestsSchema], 
    eventsAttended: [{ type: Schema.Types.ObjectId, ref: 'Event' }] 
}); 

var Event = mongoose.model('Event', eventSchema); 
var Person = mongoose.model('Person', personSchema); 

zu zeigen, um wie bevöl verwendet wird, erstellen Sie zuerst eine Person Objekt, aaron = new Person({firstname: 'Aaron'}) und ein Ereignisobjekt, event1 = new Event({title: 'Hackathon', location: 'foo'}):

aaron.eventsAttended.push(event1); 
aaron.save(callback); 

Wenn Sie dann Ihre Abfrage erstellen, können Sie Referenzen wie folgt auffüllen:

Person 
.findOne({ firstname: 'Aaron' }) 
.populate('eventsAttended') // only works if we pushed refs to person.eventsAttended 
.exec(function(err, person) { 
    if (err) return handleError(err); 
    console.log(person); 
}); 
+0

kann ich Ihnen eine Frage stellen? Was, wenn ich auch eine Liste von "Teilnehmern" im 'Ereignis'-Schema haben möchte? Würde das ein Rundschleifenproblem verursachen? – CodyBugstein

+2

Sie können simultane Referenzen in zwei Richtungen ohne mögliche zirkuläre Abhängigkeiten erstellen. Das Beispiel der [** Story and Person Schemas **] (http://mongoosejs.com/docs/populate.html) in den Mongoose-Dokumenten erklärt dies gut. – chridam

Verwandte Themen