2015-03-30 16 views
8

mam schematu Mongoose i chciałbym użyć wartości nieruchomości jako wartości domyślnej dla innej nieruchomości, coś jak:Jak użyć wartości właściwości jako wartości domyślnej dla innej właściwości?

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

myślałem, że to możliwe, ale najwyraźniej nie jest, może ktoś potwierdzić, że i ewentualnie dać mi odniesienie?

+3

Możesz to zrobić [w '.pre ('save')' hook] (http://mongoosejs.com/docs/middleware.html). –

+0

Tak, właśnie to zrobiłem, wydaje mi się to dziwne, że nie można go zdefiniować w schemacie. w każdym razie dzięki! – bncc

+0

Może utworzyć "właściwość wirtualną", która zwraca 'otherProperty', jeśli jest zdefiniowane inaczej' myProperty'. Przejdź do http://mongoosejs.com/docs/guide.html i przewiń do "Wirtualnych". –

Odpowiedz

1

Chociaż nie ma wbudowanego sposobu, można napisać kilka funkcji pomocnika, aby zachowywać się tak, jak chcesz. Przykładowy schemat:

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

można umieścić następujące funkcje pomocnicze w innych plikach wymagać i wykorzystać je do wszystkich modeli/schematów:

// 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; 
} 

To nie działa dla zagnieżdżonych schematów, ale może poprawić kod, aby tak się stało.

Powiązane problemy