【发布时间】:2018-04-14 07:40:39
【问题描述】:
我正在尝试使电子邮件字段在数据库级别上具有唯一性。当使用相同的 emailId 创建新文档时,它应该会引发错误。
为了实现它,我正在使用
email : {type: String, trim: true, index: true, unique: true, sparse: true,required: true}
但它似乎不起作用,目前它正在添加具有相同 emailId 的新文档。
推荐这篇文章:mongoDB/mongoose: unique if not null
检查了.getIndexes(),这是它的输出:
【问题讨论】:
-
那里有一些不需要的选项可以相互抵消。如果您的意思是
"unique",那么您不需要或不需要sparse或required,它们分别是相互冲突和隐含的。如果那里没有索引,则可能存在错误,因为数据不符合“唯一”约束。进入 shell,检查集合中带有.getIndexes()的索引,然后尝试使用.createIndex()创建索引(如果不存在),您应该会看到错误。如果您仍然不明白,请发布当前索引和/或错误。 -
我对 mongoDb 不太了解,但我删除了
sparse和required但仍然得到相同的输出。检查带有.getIndexes()的索引已将其输出添加到问题本身中 -
我还请您尝试
.createIndex({ "email": 1 }, { "unique": true })。在 mongoose 模式上设置选项此时不会解决此问题。您尝试从“shell”创建索引(请因为我们想要“文本”而不是屏幕截图)并查看报告的错误。它会告诉您索引创建失败,它会告诉您“确切原因”以及当前哪些数据导致了问题。 -
知道了。尝试命令
.createIndex()并收到此错误E11000 duplicate key error collection: diesel-local.admins index: email_1 dup key: { : \"admin@admin.com\" } -
是的,所以现在您看到“电子邮件”中有“重复”信息。在创建“唯一”索引之前,您需要“删除重复项”。现在明白了吗?