mongoDb/Mongoose:使 emailId 唯一字段[重复]
Posted
技术标签:
【中文标题】mongoDb/Mongoose:使 emailId 唯一字段[重复]【英文标题】:mongoDb/Mongoose: make emailId unique field [duplicate] 【发布时间】: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\"
是的,所以现在您看到“电子邮件”中有“重复”信息。在创建“唯一”索引之前,您需要“删除重复项”。现在明白了吗?
【参考方案1】:
你可以使用mongoose-unique-validator
const mongoose = require('mongoose')
const uniqueValidator = require('mongoose-unique-validator')
const Schema = mongoose.Schema
const UserSchema = new Schema(
email:
type: String,
required: true,
unique: true
,
username:
type: String,
required: true,
unique: true
)
UserSchema.plugin(uniqueValidator)
module.exports = mongoose.model('Users', UserSchema)
【讨论】:
插件工作正常,但有没有其他方法可以在不使用插件的情况下解决问题? 我已经尝试了所有@Lovika 我没有找到的解决方案以上是关于mongoDb/Mongoose:使 emailId 唯一字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用用户名和密码连接 mongodb(mongoose)?