2015-03-16 16 views
6

Bir flört uygulaması için bir Mongoose şeması yapıyorum.Mongoose şemasındaki başka bir şemaya nasıl başvurulur?

Her bir person belgesinin, sahip oldukları tüm etkinliklere bir referans içermesini istiyorum; burada events, sistemde kendi modellerine sahip başka bir şemadır. Bunu şemada nasıl tarif edebilirim?

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

Böyle bir şey, inanıyorum: 'eventsAttended: [{type: app.mongoose.Schema.ObjectId, ref: 'Event'}]' –

cevap

13

Sen Population

Nüfus kullanarak tanımlayabiliriz otomatik olarak diğer koleksiyon (lar) dan belgenin (ler) ile dokümanında belirtilen yolları değiştirilmesi işlemidir. , tek bir belgeyi, birden çok belgeyi, düz nesneyi, çoklu düz nesneleri veya bir sorgudan döndürülen tüm nesneleri doldurabilir.

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

:

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

öncelikle bir kişi nesnesi, aaron = new Person({firstname: 'Aaron'}) ve olay nesnesi, event1 = new Event({title: 'Hackathon', location: 'foo'}) oluşturmak, doldurmak nasıl kullanıldığını göstermek için: aşağıdaki gibi

senin Olay Şeması tanımlanır varsayalım Daha sonra, sorgunuzu yaptığınızda, şu gibi başvuruları doldurabilirsiniz:

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

size bir soru sorabilir miyim? Ayrıca 'etkinlik' şemasında 'katılımcıların bir listesini de yapmak ister miydiniz? Bu döngüsel bir döngü sorununa neden olur mu? – CodyBugstein

+2

Herhangi bir olası dairesel bağımlılık olmaksızın iki yönde eşzamanlı referanslar oluşturabilirsiniz. Mongoose belgelerinde yer alan [** Story and Person şemaları **] (http://mongoosejs.com/docs/populate.html) örneği bu durumu iyi açıklıyor. – chridam

İlgili konular