2016-05-15 26 views
1

Ich habe ein E-Mail-Feld, wo ich einzigartige E-Mails möchte. Ich möchte auch die Möglichkeit eines leeren Feldes haben. Ich möchte nicht, dass die Eindeutigkeit überprüft wird, wenn die E-Mail leer ist/null/nicht vorhanden ist.Mungo/keystonejs: einzigartiges Feld außer wenn das Feld leer ist

Hier ist meine Liste Schema in Keystone definiert:

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 macht die Mungo-Schema, so kann ich zugreifen. Ich könnte eine benutzerdefinierte Validierung hinzufügen, die eine Abfrage außer wenn Feld leer macht, aber ich hoffe auf etwas eleganteres.

Ich habe bereits viele Daten, ich weiß nicht, ob das die Indizierung komplexer macht.

Antwort

1

Ich gehe davon aus, dass Sie diese Frage stellen, dass unique: true nicht das tut, was Sie wollen, wenn das E-Mail-Feld leer ist.

Sie könnten versuchen, sparse: true wie gezeigt here, wenn Keystone einfach das direkt auf das Schema passt, sollten Sie in Ordnung sein.

Wenn nicht, ist der beste Weg, wie Sie erwähnen, wahrscheinlich, einen einfachen Pre-Save-Hook hinzuzufügen, um dies für Sie zu tun, da es derzeit keine Optionen in Keystone gibt, um Ihnen dies zu ermöglichen.

Hoffe, dass hilft (und lassen Sie mich wissen, wenn sparse: true funktioniert)!

+0

Ich habe versucht mit sparse: True, aber das hat nicht für mich funktioniert. – Tom

+0

Es könnte sich lohnen, es zuerst auf einer leeren Datenbank auszuprobieren, nur um zu überprüfen, ob es nicht bereits Daten sind. Wenn nicht, wird es wahrscheinlich ein Pre-Save-Hook sein. –

1

Verwenden Sie Books.schema.index({email: 1}, {sparse: true}), nachdem Sie das Feld hinzugefügt und entfernen Sie die index: true aus dem Feld. Dies ruft Mongoose direkt an.

Vergessen Sie nicht, den alten Index aus Ihrer Sammlung zu entfernen (oder löschen Sie einfach die Tabelle).

Was ich nicht verstehe ist, warum sollte es nicht nur arbeiten, weil die Optionen zu übergeben scheinen direkt an Mungo: https://github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js#L242

Vielleicht ist es arbeitete bereits und man hatte den alten eindeutigen Index für da?

Verwandte Themen