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公开了mongoose模式,所以我可以访问它。 我可以添加一个自定义的validation,使查询,除非字段为空,但我希望更优雅的东西。
我已经有了大量的数据,我不知道这是否使索引的东西更复杂。
我假设你问这个问题是unique: true
当电子邮件字段为空时, unique: true
没有做你想做的事情。
你可以尝试设置sparse: true
,如图所示,如果keystone直接将其直接传递给模式,你应该没问题。
如果没有,最好的方法,正如你所说的,可能只是添加一个简单的预保存钩子来为你做这个,因为目前在keystone中没有选项可以让你做到这一点。
希望有帮助(并让我知道如果sparse: true
作品)!
使用Books.schema.index({email: 1}, {sparse: true})
添加字段并从字段中删除index: true
。 这直接调用Mongoose。
不要忘记从您的集合中删除旧的索引(或者干脆删除表格)。
我不明白的是为什么它不会工作,因为这些选项似乎直接传递给Mongoose: https : //github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js# L242
也许它已经工作,你有那里的旧唯一索引?