【问题标题】:Mongoose/keystonejs: unique field except if field is emptyMongoose/keystonejs:唯一字段,除非字段为空
【发布时间】:2016-09-11 11:31:27
【问题描述】:

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

这是我在 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 公开了猫鼬模式,所以我可以访问它。我可以添加一个自定义验证来进行查询,除非字段为空,但我希望有更优雅的东西。

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

【问题讨论】:

    标签: node.js mongodb mongoose keystonejs


    【解决方案1】:

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

    您可以尝试设置sparse: true,如here 所示,如果keystone 只是将其直接传递给架构,您应该没问题。

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

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

    【讨论】:

    • 我确实尝试过使用 sparse: true,但这对我不起作用。
    • 首先在一个空数据库上尝试它可能是值得的,只是为了检查它是不是你已经有数据的事实。如果没有,它可能必须是一个预保存钩子。
    【解决方案2】:

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

    不要忘记从集合中删除旧索引(或直接删除表)。

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

    也许它已经奏效了,而且你那里有旧的唯一索引?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2014-04-04
      • 2018-04-14
      • 2019-08-08
      • 1970-01-01
      • 2013-04-10
      • 2018-03-16
      相关资源
      最近更新 更多