Mongoose/keystonejs: уникальное поле, за исключением случаев, когда поле пусто

У меня есть поле электронной почты, где я хочу уникальные электронные письма. Я также хочу иметь возможность пустого поля. Я не хочу, чтобы он проверял уникальность, если электронное письмо пустое/нулевое/отсутствует.

Вот моя схема списка, определенная в 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 предоставляет схему мангуста, так что я могу получить к ней доступ. Я мог бы добавить пользовательскую проверку, которая делает запрос, за исключением случаев, когда поле пустое, но я надеюсь на что-то более элегантное.

У меня уже есть много данных, я не знаю, усложняет ли это индексирование.


person Tom    schedule 15.05.2016    source источник


Ответы (2)


Исходя из того, что вы задаете этот вопрос, я предполагаю, что unique: true не делает то, что вы хотите, когда поле электронной почты остается пустым.

Вы можете попробовать установить sparse: true, как показано здесь, если keystone просто передает это прямо в схема у вас должна быть в порядке.

Если нет, то, как вы упомянули, лучший способ, вероятно, просто добавить простой крючок для предварительного сохранения, чтобы сделать это за вас, поскольку в настоящее время в трапецеидальном искажении нет параметров, позволяющих вам сделать это.

Надеюсь, это поможет (и дайте мне знать, если sparse: true работает)!

person Jake Stockwin    schedule 23.05.2016
comment
Я пытался использовать sparse: true, но у меня это не сработало. - person Tom; 24.05.2016
comment
Возможно, стоит сначала попробовать его на пустой базе данных, просто чтобы проверить, не факт, что у вас уже есть данные. Если нет, то, вероятно, это будет крючок перед сохранением. - person Jake Stockwin; 24.05.2016

Используйте Books.schema.index({email: 1}, {sparse: true}) после добавления поля и удаления index: true из поля. Это вызывает Mongoose напрямую.

Не забудьте удалить старый индекс из вашей коллекции (или просто удалить таблицу).

Чего я не понимаю, так это почему это не сработает, потому что параметры, похоже, передаются в Mongoose напрямую: /Type.js#L242" rel="nofollow">https://github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js#L242

Возможно, это уже сработало, и у вас там был старый уникальный индекс?

person w00t    schedule 20.07.2016