Mongoose唯一验证错误,即使没有唯一约束

时间:2016-01-20 11:45:13

标签: node.js mongodb mongoose

var schema = new Schema({

    _id: Schema.ObjectId,
    email: {type: String, required: true}

});

以前email字段是唯一的(具有唯一约束) 现在我删除了唯一约束,然后它也给出了唯一的验证错误。我已经重新启动了mongo然后它也抛出了错误。 有什么想法吗?

2 个答案:

答案 0 :(得分:6)

当您删除架构定义中的唯一约束时,您也应该手动将其从数据库中删除。您可以使用 dropIndex() 方法在mongo shell中执行此操作,也可以使用本机node.js驱动程序的 dropIndex() 方法在您的应用程序中执行此操作集合。

您可能需要先检查数据库中当前的索引来确认;您很可能会在Mongoose中定义架构后填充集合时创建的电子邮件唯一索引。

您可以在mongo shell中发出命令,假设您的数据库中有一个名为users的集合,名为test

> db.users.getIndexes()

将显示当前索引,您可以在控制台中看到如下数组:

[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "name" : "_id_",
            "ns" : "test.users"
    },
    {
            "v" : 1,
            "unique" : true,
            "key" : {
                    "email" : 1
            },
            "name" : "email_1",
            "ns" : "test.users",
            "background" : true,
            "safe" : null
    }
]

对于应用程序代码中的解决方案,假设您有一个名为User的Mongoose模型,该模型具有上面定义的模式,您可以调用 getIndexes() 本机node.js司机的收集方法:

User.collection.getIndexes(function (err, results) {
    // Handle errors
});

在mongo shell中,您可以继续使用 dropIndex() 方法删除电子邮件索引:

> db.users.dropIndex("email_1")

在您的应用程序代码中,您还可以通过Mongoose模型为集合发出命令,并调用本机node.js驱动程序的 dropIndex() 集合方法:

User.collection.dropIndex("email_1", function (err, results) {
    // Handle errors
});

答案 1 :(得分:0)

您也可以按照以下步骤操作。

  1. 从数据库中删除用户集合。
  2. 保存用户模型(架构)文件并进行测试。