Mongoose/keystonejs:唯一的字段,除非字段为空

问题描述:

我有一个电子邮件字段,我想要唯一的电子邮件。我也希望有一个空白领域的可能性。如果电子邮件为空/空/不存在,我不希望它检查唯一性。Mongoose/keystonejs:唯一的字段,除非字段为空

这里是梯形定义我的列表模式:

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 } 
}); 

梯形公开猫鼬的模式,这样我就可以访问。我可以添加一个自定义的验证,除非字段为空,否则我会希望得到更优雅的东西。

我已经有足够的数据,我不知道这是否使索引的东西更复杂。

我假设你问这个问题,unique: true没有做你想要的东西,当电子邮件字段留空。

您可以尝试设置sparse: true,如here所示,如果keystone直接将该值直接传递给模式,您应该没问题。

如果没有,最好的方法,正如您所提到的,可能只是为您添加一个简单的预保存钩子,因为目前在keystone中没有选项允许您执行此操作。

希望有帮助(并让我知道如果sparse: true工程)!

+0

我确实尝试过使用稀疏:true,但那对我没有用。 – Tom

+0

可能值得在空数据库中首先尝试它,只是为了检查它不是你已经有数据的事实。如果没有,它可能必须是一个预存储钩子。 –

使用Books.schema.index({email: 1}, {sparse: true})添加字段并从字段中删除index: true。这直接调用Mongoose。

不要忘记从集合中删除旧索引(或者简单地删除表)。

我不明白的是为什么它会不只是工作,因为选择似乎要传递给直接猫鼬:https://github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js#L242

也许它已经工作,你对那里的老唯一索引?