Mangouste: l'extension des schémas
Actuellement, j'ai deux presque identique schémas:
var userSchema = mongoose.Schema({
email: {type: String, unique: true, required: true, validate: emailValidator},
passwordHash: {type: String, required: true},
firstname: {type: String, validate: firstnameValidator},
lastname: {type: String, validate: lastnameValidator},
phone: {type: String, validate: phoneValidator},
});
Et
var adminSchema = mongoose.Schema({
email: {type: String, unique: true, required: true, validate: emailValidator},
passwordHash: {type: String, required: true},
firstname: {type: String, validate: firstnameValidator, required: true},
lastname: {type: String, validate: lastnameValidator, required: true},
phone: {type: String, validate: phoneValidator, required: true},
});
Leur seule différence est dans la validation: les Utilisateurs n'ont pas besoin d'un firstname, lastname ou par téléphone. Les Admins doivent cependant avoir ces propriétés définies.
Malheureusement le code ci-dessus n'est pas très SEC, comme ils sont presque identiques. Donc je me demandais si il est possible de construire un adminSchema
basé sur la userSchema
. E. g.:
var adminSchema = mongoose.Schema(userSchema);
adminSchema.change('firstname', {required: true});
adminSchema.change('lastname', {required: true});
adminSchema.change('phone', {required: true});
Évidemment que c'est juste de pseudo-code. Est quelque chose comme cela possible?
Un autre très semblable question est de savoir si il est possible de créer un nouveau schéma basé sur un autre, et ajouter plus de propriétés. Par exemple:
var adminSchema = mongoose.Schema(userSchema);
adminSchema.add(adminPower: Number);
Et les gens déjà le faire github.com/briankircho/mongoose-schema-extend voir ce.
OriginalL'auteur Tom | 2013-08-19
Vous devez vous connecter pour publier un commentaire.
Certaines personnes ont dans d'autres endroits elle a suggéré d'utiliser utils.hérite d'étendre les schémas. Un autre moyen simple serait tout simplement de définir un objet avec les paramètres et créer des Schémas à partir d'elle, comme suit:
C'est un peu moche, mais, depuis que vous modifiez le même objet. Aussi, je voudrais être en mesure d'étendre les plugins et des méthodes, etc. Donc ma méthode préférée est la suivante:
Qui se produit pour répondre à votre deuxième question que oui, vous pouvez
add()
champs. Afin de modifier certaines propriétés du Schéma, une version modifiée de la fonction ci-dessus permettrait de résoudre votre problème:var adminSchema = UserSchema() {..
thread discute de telles hériter. Je ne trouve pas ça plus "propre" (c'est comme beaucoup de code, mais plus laid) et certaines personnes le mentionne le buggy.
OriginalL'auteur Andreas Hultgren
Mangouste 3.8.1 a maintenant un support pour les Discriminateurs. Un exemple, à partir d'ici: http://mongoosejs.com/docs/api.html#model_Model.discriminator
C'est un peu vieux, mais si vous lisez ceci dans '15, ne pas utiliser de mangouste schéma étendre. Il y a beaucoup de questions ouvertes et le plugin n'a pas été mis à jour depuis '13. Aller pour la mangouste "Discriminateurs" si vous ne voulez pas rencontrer des problèmes ...
Il est maintenant activement maintenu, mais il peut être une bonne idée de s'appuyer sur les discriminateurs de toute façon
OriginalL'auteur regretoverflow
Ajouter à cette discussion, vous pouvez également remplacer la mangouste.Schéma avec un custom de la base de définition de schéma. Pour la compatibilité de code, ajoutez l'instruction if qui permet à un Schéma à être instancié sans
new
. Alors que cela peut être pratique, réfléchir à deux fois avant de le faire dans un lieu public package.OriginalL'auteur Adam Lockhart
Je viens de publier un mongoose-super module npm. Bien que j'ai fait quelques tests, il est encore à un stade expérimental. Je suis intéressé de savoir si il fonctionne bien pour les applications de mes collègues, de SORTE que les utilisateurs!
Le module fournit une hériter() fonction qui retourne un enfant Mongoose.js modèle basé sur un modèle parent et un enfant d'extension de schéma. Elle augmente également les modèles avec un super() la méthode à appeler le parent méthodes de model. J'ai ajouté cette fonctionnalité, car c'est quelque chose que j'ai raté dans d'autres extension/l'héritage des bibliothèques.
La hériter fonction de commodité utilise simplement le le discriminant de la méthode.
OriginalL'auteur Visionscaper
Vous pouvez étendre l'original Schéma#obj:
Exemple:
Ou de l'utilisation de ce module npm, avec la même approche:
Vérifier le dépôt github https://github.com/doasync/mongoose-extend-schema
OriginalL'auteur Do Async
Toutes ces réponses semblent plutôt inutilement compliquée, avec l'extension des fonctions d'assistance ou d'étendre les méthodes appliquées à la du schéma ou de l'utilisation de plugins/discriminateurs. J'ai utilisé la solution suivante à la place qui est simple, propre et facile à travailler avec. Il définit un modèle pour le schéma de base, et le schéma sont construites en utilisant le plan d'action:
foo.blueprint.js
foo.schema.js
bar.schema.js
Vous pouvez utiliser le plan d'action pour le schéma d'origine comme il est, et à l'aide de
Object.assign
vous pouvez prolonger le plan d'action de la manière dont vous comme pour les autres du schéma, sans modification de l'objet même.OriginalL'auteur Adam Reis
Je n'ai pas besoin de la discrimination, comme je l'ai été en train de s'étendre sous le schéma de documents qui sont stockés en tant que partie d'un document parent de toute façon.
Ma solution a été d'ajouter un "étendre" la méthode le schéma est le schéma de base, de sorte que vous pouvez utiliser soit le schéma de base lui-même ou de générer un nouveau schéma basé sur elle.
ES6 code suit:
Vous pouvez maintenant utiliser ce schéma, comme est, ou "extension" de nécessaires:
Extension dans ce cas, crée une nouvelle marque de définition de Schéma.
OriginalL'auteur Adam Reis