Anche se non esiste un modo integrato, è possibile scrivere alcune funzioni di supporto per comportarsi come si desidera. Uno schema di esempio:
module.exports = function(){
var schemaDef = {
email : {type : String, required: true},
secondaryEmail : {type : String, required: true, selfDefault: "email"},
fullName : {type : String, required: true, selfDefault: {fields: ["firstName","middleName", "lastName"], space: true}},
password: {type: String, required: true},
firstName : {type : String, required: true},
middleName : {type : String, required: true},
lastName : {type : String, required: true}
};
var selfDefaults = initSelfDefaults(schemaDef);
var UserSchema = new Schema(schemaDef);
UserSchema.pre('validate', function(next) {
setSelfDefaults(this, selfDefaults)
next();
});
return mongoose.model("User", UserSchema);
};
È possibile posizionare i seguenti funzioni di assistenza in altri file per richiedere e li usa per tutti i modelli/schemas:
// gets and returns all selfDefaults from the scehmaDef obj. Throws error if selfDefault reference is invalid
function initSelfDefaults(schemaDef){
var defaults = {};
for(var key in schemaDef){
if(schemaDef[key].selfDefault){
if(schemaDef[key].selfDefault.fields){
schemaDef[key].selfDefault.fields.forEach(function(field){
if (!schemaDef[field]){
throw new Error(field + " is an invalid selfDefault reference")
}
})
}
else if(!schemaDef[schemaDef[key].selfDefault]){
throw new Error(schemaDef[key].selfDefault + " is an invalid selfDefault reference")
}
defaults[key] = schemaDef[key].selfDefault;
delete schemaDef[key].selfDefault;
}
};
return defaults
}
// sets the selfDefaults for the fields of the document being created if the fields are empty
function setSelfDefaults(doc, defaults){
for(var key in defaults){
if(!doc[key]){
if(defaults[key].fields){
var fields = [];
for(var i=0; i<defaults[key].fields.length; i++){
if(doc[defaults[key].fields[i]]){
fields.push(doc[defaults[key].fields[i]])
}
}
doc[key] = defaults[key].space? fields.join(" ") : fields.join("");
}
else{
doc[key] = doc[defaults[key]];
}
}
}
return;
}
Non funziona per gli schemi nidificati, ma si puoi modificare il codice per renderlo tale.
fonte
2016-10-13 21:03:25
Si potrebbe fare [in '.pre ('save')' hook] (http://mongoosejs.com/docs/middleware.html). –
Sì, è proprio quello che ho fatto, mi sembra strano che non sia possibile definirlo nello schema. comunque grazie! – bncc
Forse creare una 'proprietà virtuale' che restituisce 'otherProperty' se è definita diversamente' myProperty'. Vai a http://mongoosejs.com/docs/guide.html e scorri fino a "Virtuals". –