2015-03-30 15 views
8

Ho uno schema di mangusta e vorrei utilizzare il valore di una proprietà come valore predefinito per un'altra proprietà, qualcosa come:Come utilizzare il valore di una proprietà come valore predefinito per un'altra proprietà?

schemaDef = { 
    myProperty: {type: String, required: true} 
    ... 
    otherProperty: {type: String, default: this.myProperty} 
} 

ho pensato che fosse possibile, ma a quanto pare non è, qualcuno potrebbe confermare che e forse darmi un riferimento?

+3

Si potrebbe fare [in '.pre ('save')' hook] (http://mongoosejs.com/docs/middleware.html). –

+0

Sì, è proprio quello che ho fatto, mi sembra strano che non sia possibile definirlo nello schema. comunque grazie! – bncc

+0

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". –

risposta

1

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.

Problemi correlati