2017-03-07 2 views
0

Puis-je utiliser mongoose SubDocuments récursivement? J'ai cet objet:Sous-documents mungoose profondeur possible

var Player = { 
    city: { 
    energy: { 
     solar: 20, 
     fusion: 0 
    } 
    } 
}; 

et schémas correspondants:

var PlayerSchema = new Schema({ 
    city: CitySchema 
}); 
PlayerSchema.pre('save', function(next){ 
    this.city = {}; 
}); 

var EnergySchema = new mongoose.Schema({ 
    solar: {type: Number, default: 0}, 
    fusion: {type: Number, default: 0} 
}); 

var CitySchema = new mongoose.Schema({ 
    last_update: { type: Date, default: Date.now }, 
    energy: EnergySchema 
}); 

CitySchema.pre('save', function (next) { 
    this.energy = {}; 
}); 

Mais sauver cet objet sauve seule ville sans énergie. (Au cours de PlayerSchema.pre('save', ...) avec la commande this.city = {}; est créé un objet à partir CitySchema avec des valeurs par défaut, mais sans prendre en note la méthode CitySchema.pre('save', ...) qui conduit à l'attribut d'énergie non définie dans la ville.)

Je voudrais éviter peuplant et faire des références à travers ObjectId.

Est-il possible d'enregistrer un objet Player avec seulement des sous-documents?

Répondre

0

Puisque vous définissez la ville d'être un objet vide ici:

PlayerSchema.pre('save', function(next){ 
    console.log(this.city); //Should be { energy: { solar, fusion }} 
    this.city = {}; 
    console.log(this.city); //Now {} 
}); 

Autre que cela devrait fonctionner correctement.

+0

Dans Player après 'this.city = {};' mongoose crée correctement une nouvelle ville avec des valeurs par défaut du schéma. Dans votre dernier 'console.log', la sortie serait:' {lastUpdate: '2017-03-08 ...'} '. Le problème est que cet attribut 'energy: EnergySchema from CitySchema' est manquant: Parce que la méthode' CitySchema.pre ('save', ...); 'n'est pas appelée pendant' PlayerSchema.pre ('save', ...); ' – James07