独特的验证不适用于Mongoose

时间:2016-05-14 23:38:19

标签: javascript node.js mongodb mongoose

我发现这个问题有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查询,我可以看到两个模型都已创建。我做错了什么?

修改

以下是我已尝试的一些事项:

  • 添加索引后重启MongoDB
  • 删除所有现有记录,以便不存在可能违反唯一性约束的现有记录
  • 所有这些方式定义email属性(我在不同的地方看到了不同的实现):{ type: String, required: true, unique: true }{ type: String, required: true, index: true, unique: true }{ type: String, required: true, index: { unique: true } }

2 个答案:

答案 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)在邮递员中测试,您将发现比现在更有效

干杯。