2012-11-25 7 views

Répondre

2

Définissez le champ en tant que getter virtual au lieu d'un champ traditionnel.

Par exemple, supposons que vous vouliez rendre le champ pop de votre collection en lecture seule quand on y accède via Mongoose:

var schema = new Schema({ 
    city: String, 
    state: String 
}); 

schema.virtual('pop').get(function() { 
    return this._doc.pop; 
}); 

En accédant au membre _doc privé de votre instance de modèle, il est possible que ce peut briser la l'avenir, mais cela a bien fonctionné quand je l'ai testé tout à l'heure.

+0

comment ça marche? les virtuals ne sont pas persistés, n'est-ce pas? – sidgate

+1

@sidgate Ceci est une ancienne réponse et un peu un hack pour exposer un champ non défini dans le schéma, mais présent dans les documents sous-jacents. Donc vous avez raison que les virtuals ne sont pas persistés, mais puisque le champ 'pop' est déjà là, cela fonctionne car le document brut est disponible via le champ' _doc' (non documenté). – JohnnyHK

11

Une alternative si vous souhaitez définir une valeur par défaut qui ne peut jamais être changé:

var schema = new Schema({ 
    securedField: { 
    type: String, 
    default: 'Forever', 
    set: function (val) { return this.securedField; } 
});