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

时间:2016-05-15 16:47:09

标签: node.js mongodb mongoose keystonejs

我有一个电子邮件字段,我想要独特的电子邮件。我也希望有一个空场的可能性。如果电子邮件为空/无/不存在,我不希望它检查唯一性。

这是我在Keystone中定义的List模式:

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架构,所以我可以访问它。我可以添加一个自定义验证来进行查询,除非字段为空,但我希望有更优雅的东西。

我已经掌握了大量数据,但我不知道这是否会使索引内容更加复杂。

2 个答案:

答案 0 :(得分:2)

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

您可以尝试设置sparse: true,如图所示this answer,如果keystone直接将其传递给架构,那么您应该没问题。

如果没有,正如你所提到的,最好的方法可能只是为你添加一个简单的预保存挂钩,因为目前keystone中没有选项可以让你这样做。

希望有帮助(如果sparse: true有效,请告诉我们)!

答案 1 :(得分:2)

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

不要忘记从您的收藏中删除旧索引(或只是删除表格)。

我不明白为什么它不会起作用,因为这些选项似乎直接传递给Mongoose:https://github.com/keystonejs/keystone/blob/94b34fe2239a0b571bf1421d45493d32896502a9/fields/types/Type.js#L242

也许它已经有效了,你那里有旧的独特索引?