E11000 MongoDB猫鼬中的重复键错误索引

以下是我useruser.js模型中的架构-

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
    },
    facebook: {
        id           : { type: String },
        token        : { type: String },
        email        : { type: String },
        name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

这就是我在控制器中使用它的方式-

var user = require('./../models/user.js');

这就是我将其保存在数据库中的方式-

user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

错误 -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"} 

我检查了db集合,并且没有这样的重复条目,让我知道我在做什么错吗?

仅供参考- req.body.emailreq.body.password被获取的值。

我也检查了这篇文章,但没有帮助STACK LINK

如果我将其完全删除,那么它将插入文档,否则即使我在local.email中有一个条目,也会引发错误“ Duplicate”错误

宝儿2020/03/23 14:18:36

请清除集合或从MongoDB数据库中删除整个集合,然后再试一次。

卡卡西凯2020/03/23 14:18:36

在这种情况下,登录Mongo会找到您不再使用的索引(在OP中为“ email”)。然后选择掉落指数 在此处输入图片说明

Stafan2020/03/23 14:18:36

当我尝试修改使用mangoose定义的架构时,我遇到了相同的问题。我认为问题是由于创建集合时需要执行一些基础过程,例如描述对用户隐藏的索引(至少在我的情况下),所以我发现的最佳解决方案是删除整个集合然后重新开始。

Tom凯2020/03/23 14:18:36

遇到相同的问题,我通过删除unique属性来解决了该问题

只是找到另一种方法来验证或检查模式的唯一属性值。

Stafan小小猿2020/03/23 14:18:36

我也遇到了这个问题,我解决了。此错误表明此处已经存在电子邮件。因此,您只需要从“电子邮件模型”属性中删除此行。

unique: true

即使它不起作用,也有可能。因此,只需要从MongoDB中删除集合,然后重新启动服务器即可。

斯丁2020/03/23 14:18:36

更改集合名称(如果它已经存在于数据库中),它将显示错误。如果给定任何属性作为唯一属性,则将发生相同的错误。

十三2020/03/23 14:18:36

我有同样的问题。问题是我从模型中删除了一个字段。当我删除数据库时,它可以修复

卡卡西Near2020/03/23 14:18:36

首先在保存时建立一些索引后,从架构中删除属性后,会出现相同的问题从架构中删除属性会导致不存在的属性(仍具有索引)的值为空。从此处删除索引或从头开始创建新集合会有所帮助。

注意:在这种情况下,错误消息将引导您。它有一条路径,已经不存在了。在我的情况下,旧路径是... $ uuid_1(这是一个索引!),但是新路径是.... * priv.uuid_1

JinJin2020/03/23 14:18:36

这是因为已经存在与配置同名的集合。只需通过mongo shell从mongodb中删除该集合,然后重试。

db.collectionName.remove()

现在运行您的应用程序,它应该可以工作

EvaPro2020/03/23 14:18:36

我遇到过同样的问题。尝试调试不同的方式无法解决。我尝试删除该集合,之后效果很好。尽管如果您的收藏集中有很多文档,这不是一个好的解决方案。但是,如果您处于开发的早期阶段,请尝试删除该系列。

db.users.drop();
老丝阿飞2020/03/23 14:18:36

我有一个类似的问题,我意识到默认情况下,mongo每个集合仅支持一个架构。将新架构存储在其他集合中,或者删除当前集合中具有不兼容架构的现有文档。或者找到一种方法,使每个集合具有多个架构。

蛋蛋猿2020/03/23 14:18:36

这是我的相关经验:

在“用户”模式中,我将“名称”设置为唯一键,然后运行一些执行,我认为这已经建立了数据库结构。

然后,我将唯一键更改为“用户名”,并且在将数据保存到数据库时不再传递“名称”值。因此,mongodb可能会自动将新记录的“名称”值设置为null,这是重复键。{name: {unique: false, type: String}}为了覆盖原始设置,我尝试将“用户”模式中的“名称”键设置为非唯一键 但是,它没有用。

最后,我制定了自己的解决方案:

只需设置一个随机键值,该键值在保存数据记录时就不会与“名称”键重复。简单地,Math方法'' + Math.random() + Math.random() 会生成一个随机字符串。

Mandy蛋蛋2020/03/23 14:18:36

如果您仍处于开发环境中,那么我将删除整个数据库,并从新的架构开始。

从命令行

➜ mongo
use dbName;
db.dropDatabase();
exit
Gil伽罗小宇宙2020/03/23 14:18:36

好吧,基本上这个错误是说,您在特定字段上具有唯一索引,例如:“ email_address”,因此mongodb期望集合中每个文档的唯一电子邮件地址值。

假设我们在架构的早期没有定义唯一索引,然后您用相同的电子邮件地址或没有电子邮件地址(空值)注册了2个用户。

后来,您发现这里有一个错误。因此您尝试通过向架构添加唯一索引来更正它。但是您的集合已经有重复项,因此错误消息表明您不能再次插入重复值。

您基本上有三个选择:

  1. 删除收藏集

    db.users.drop();

  2. 查找具有该值的文档并将其删除。假设该值为空,您可以使用以下方法将其删除:

    db.users.remove({ email_address: null });

  3. 删除唯一索引:

    db.users.dropIndex(indexName)

我希望这可以帮助:)

2020/03/23 14:18:36

我遇到了类似的问题,我只想清除特定领域的索引,然后为我工作。 https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/

西里神奇2020/03/23 14:18:36

检查收集索引。

由于字段收集中的索引已过时,因此出现了这个问题,该索引应通过其他新路径存储。

当您将字段指定为唯一时,猫鼬会添加索引。

2020/03/23 14:18:36

错误消息是说已经有一条记录null作为电子邮件。换句话说,您已经有一个没有电子邮件地址的用户。

相关文档:

如果文档在唯一索引中没有索引字段的值,则索引将为此文档存储一个空值。由于存在独特的约束,MongoDB将只允许一个缺少索引字段的文档。如果有多个文档没有索引字段的值,或者缺少索引字段,则索引构建将失败,并出现重复的键错误。

您可以将唯一性约束与稀疏索引结合使用,以从唯一性索引中过滤这些空值并避免错误。

唯一索引

稀疏索引仅包含具有索引字段的文档条目,即使索引字段包含空值也是如此。

换句话说,对于所有都具有null值的多个文档,可以使用稀疏索引

稀疏索引


来自评论:

您的错误表明该键已命名mydb.users.$email_1,这使我怀疑您在users.email上都具有索引users.local.email(该键现在旧且未使用)。从猫鼬模型中删除字段不会影响数据库。检查mydb.users.getIndexes()是否存在这种情况,并使用手动删除不需要的索引mydb.users.dropIndex(<name>)