2016-05-15 5 views
1

J'ai un champ email, où je veux des emails uniques. Je veux aussi avoir la possiblité d'un champ vide. Je ne veux pas qu'il vérifie l'unicité si l'email est vide/null/absent.Mongoose/keystonejs: champ unique sauf si le champ est vide

Voici mon schéma de liste définie à Keystone:

Book.add({ 
    number: { type: Types.Number }, 
    email: { type: Types.Email, initial: true, index: true, unique: true }, 
    token: { type: Types.Text }, 
    title: { type: Types.Text, initial: true }, 
    author: { type: Types.Text, initial: true }, 
    name: { type: Types.Text, initial: true }, 
    dedication: { type: Types.Textarea, initial: true }, 
    image: { type: Types.CloudinaryImage } 
}); 

Keystone expose le schéma mangouste, donc je peux avoir accès. Je pourrais ajouter une validation personnalisée qui fait une requête sauf si le champ est vide, mais j'espère quelque chose de plus élégant.

J'ai déjà beaucoup de données, je ne sais pas si cela complique l'indexation.

Répondre

1

Je suppose du fait que vous posez cette question que unique: true ne fait pas ce que vous voulez quand le champ d'email est laissé vide.

Vous pouvez essayer de définir sparse: true comme indiqué here, si la clé de voûte passe simplement cela directement au schéma, cela devrait aller. Si ce n'est pas le cas, la meilleure façon, comme vous le mentionnez, est probablement simplement d'ajouter un simple crochet de pré-sauvegarde pour faire cela pour vous, car il n'y a actuellement aucune option dans Keystone pour vous permettre de le faire.

Espérons que cela aide (et laissez-moi savoir si sparse: true fonctionne)!

+0

J'ai essayé d'utiliser sparse: true, mais cela n'a pas fonctionné pour moi. – Tom

+0

Il peut être utile de l'essayer sur une base de données vide, juste pour vérifier que ce n'est pas le fait que vous avez déjà des données. Sinon, il va probablement falloir être un crochet de pré-sauvegarde. –

1

Utilisez Books.schema.index({email: 1}, {sparse: true}) après avoir ajouté le champ et supprimé le index: true du champ. Cela appelle Mongoose directement. N'oubliez pas de supprimer l'ancien index de votre collection (ou simplement de supprimer la table).

Ce que je ne comprends pas pourquoi cela ne fonctionnerait pas juste, parce que les options semblent être passées à Mongoose directement: https://github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js#L242

Peut-être déjà travaillé et vous avez eu l'ancien index unique là-bas?