我发现这个问题有been asked before,但这些解决方案似乎都不适合我。
我有一个简单的模型我定义如下:
const mongoose = require('mongoose')
const { Schema } = mongoose
let subscriberSchema = new Schema({
firstName: { type: String, required: true },
email: { type: String, required: true, unique: true }
}, { timestamps: true })
let Subscriber = mongoose.model('Subscriber', subscriberSchema)
如果我运行以下命令(在REPL中,所以没有异步问题),我希望在第二次调用create
时看到记录错误。
Subscriber.create({ firstName: "Landon", email: "example@example.com" })
Subscriber.create({ firstName: "Landon", email: "example@example.com" }, function(err) {
console.log("ERROR", err)
})
相反,我看到"ERROR" null
。
如果我运行count
查询或find
查询,我可以看到两个模型都已创建。我做错了什么?
修改
以下是我已尝试的一些事项:
email
属性(我在不同的地方看到了不同的实现):{ type: String, required: true, unique: true }
,{ type: String, required: true, index: true, unique: true }
,{ type: String, required: true, index: { unique: true } }
。答案 0 :(得分:2)
使用node解决这个问题非常复杂,因为你知道它的异步。 如果您同时运行两个查询,则两者将检查doc是否同时存在,并且两者都将尝试创建记录。
你可以做两件事。
创建唯一索引
YourModel.index({ email: 1}, { unique: true })
OR
使用$ setOnInsert
var pk = {email : 'your email'};
YourModel.update(pk, {
$setOnInsert : data
}, {upsert : true})
确保mongoDB中存在索引。
Mongoose不会修改密钥集的索引。首先尝试从mongo shell中删除索引。
db.collection.dropIndex({email : 1})
重新启动节点进程,mongoose现在将创建具有唯一约束的索引。
答案 1 :(得分:0)
实际上,验证工作的唯一方法是如何?请按照以下步骤操作:
1)设置唯一:对于架构中的某些字段为true(例如“电子邮件”)
2)删除整个数据库
3)重启节点服务器
4)在邮递员中测试,您将发现比现在更有效
干杯。