2013-02-14 16 views
6

ben aşağıdaki gibi iki firavunfaresi şemaları var:Gelincik kompleks (zaman uyumsuz) virtuals

var playerSchema = new mongoose.Schema({ 
    name: String, 
    team_id: mongoose.Schema.Types.ObjectId 
}); 
Players = mongoose.model('Players', playerSchema); 

var teamSchema = new mongoose.Schema({ 
    name: String 
}); 
Teams = mongoose.model('Teams', teamSchema); 

ben de sanal oluşturulan takım almak istiyorsunuz Ekipleri sorgulandığında:

Teams.find({}, function(err, teams) { 
    JSON.stringify(teams); /* => [{ 
     name: 'team-1', 
     squad: [{ name: 'player-1' } , ...] 
    }, ...] */ 
}); 

ama Ben bu sanal kullanarak elde edemiyorum, çünkü bir asy ihtiyacım var nc çağrı:

teamSchema.virtual('squad').get(function() { 
    Players.find({ team_id: this._id }, function(err, players) { 
    return players; 
    }); 
}); // => undefined 

bu sonucu elde etmenin en iyi yolu nedir?

Teşekkürler!

teamSchema.methods.getSquad = function(callback) { 
    Players.find({ team_id: this._id }, callback); 
}); 

cevap

4

Bu

muhtemelen en iyi Arayan zaman uyumsuz sonuç almak için bir geri arama sağlayabilir böylece teamSchema eklediğiniz bir instance method olarak ele alınır takımlar ile takımların listesi, ben takımlar için takımlar var -> her takımın üzerine döngü -> her takım için> getSquad -> takım dizisinin bir klonunu yarat (çünkü dönen dizide yeni öznitelikler ekleyemiyorum) ve enjekte et her takım için kadro -> res.json (clonedArray)?
+3

ama şu anda bir REZİL hizmetinde örneğin Almak istediğim: – frx08

+3

Sorgunuzda yaptığınız gibi işlem yapmanız gerektiğinde, sorgunuzda ['lean()'] (http://mongoosejs.com/docs/api.html#query_Query-lean) kullanın. 'teams.find(). lean(). exec (cb)' – JohnnyHK

+2

Bugün daha iyi bir çözüm var mı? – Linial