【发布时间】:2017-02-09 10:30:46
【问题描述】:
我正在尝试在现有数据库中的猫鼬模型上按字段强制执行唯一性。
const UserSchema = new mongoose.Schema({
email: {
type: String,
required: true,
unique: true,
}
})
然后,当我使用已分配的电子邮件创建用户时,它通过了,并且我有 2 个用户使用相同的电子邮件。
我已阅读所有相关的 SO 答案 > 2015 以及所有关于 dropDups、which is deprecated 的内容。
我想我通过手动运行解决了这个问题
db.users.createIndex({email:1}, {unique:true})
然而,这在开发和生产中显然变得很麻烦,尤其是考虑到属性负责处理它的mongoose docs 状态:
unique: boolean,是否在该属性上定义唯一索引。
考虑到现有数据库和新集合,有人可以提供一个明确的解决方案来在 Mongoose 模型上按字段强制执行唯一性吗?谢谢
【问题讨论】:
-
@JohnnyHK 这怎么可能是骗局?您是否建议每次要添加具有唯一字段的集合时都必须手动调用
db.collection.dropIndex('fieldName_1')?根本不回答我的问题 -
经常发生的情况是您没有意识到该集合已经在该字段上具有(非唯一)索引,因此 Mongoose 不会添加您定义的唯一索引。
db.users.getIndexes()显示什么? -
我删除了集合以重新开始并创建了一个新用户。
db.users.getIndexes()现在显示[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "testdb.users" } ]@JohnnyHK -
您的环境中可能禁用了
autoIndex。尝试通过添加对UserSchema.set('autoIndex', true);的调用来启用它,然后再试一次。
标签: javascript node.js mongodb mongoose mongoose-schema