MongoError,err:E11000 重复键错误

Posted

技术标签:

【中文标题】MongoError,err:E11000 重复键错误【英文标题】:MongoError,err:E11000 duplicate key error 【发布时间】:2012-11-07 09:31:56 【问题描述】:

我有一个这样的 MongoDb 架构

    var User = new Schema(
    "UserName":  type: String, required: true ,
    "Email":  type: String, required: true, unique: true ,
    "UserType":  type: String ,
    "Password":  type: String 
);

我正在尝试创建一个新用户 这是在 NodeJs 中使用 mongoose ODM 完成的 这是创建的代码:

    controller.createUser = function (req, res) 

    var user = new models.User(
        "UserName": req.body.UserName.toLowerCase(),
        "Email": req.body.Email.toLowerCase(),
        "UserType": req.body.UserType.toLowerCase()
    );
    models.User.findOne( 'Email': user.Email , function (err, olduser) 
                    if (!err) 
                        if (olduser) 
                            res.send( 'statusCode': 409, 'statusText': 'Email Already Exists' );
                        
                        else if (!olduser) 
                            user.setPassword(req.body.Password);
                            user.save(function (err, done) 
                                if (!err) 
                                    console.log(user);
                                    res.send( 'statusCode': 201, 'statusText': 'CREATED' );
                                
                                else 
                                    res.send( 'Status code': 500, 'statusText': 'Internal Server Error' );
                                
                            );
                        
                    
                    else 
                        res.send( 'statusCode': 500, 'statusText': 'ERROR' );
                    
                );
;

为了创建新用户,我给出的属性和值如下:

 
"UserName": "ann",
"Email": "ann@ann.com",
"UserType": "normaluser",
"Password":"123456"

我收到这样的错误:

"Status code":500,"statusText":"Internal Server Error","Error":"name":"MongoError","err":"E11000 duplicate key error index: medinfo.users.$UserName_1  dup key:  : \"ann\" ","code":11000,"n":0,"connectionId":54,"ok":1

我知道这个错误是因为用户名重复,但是我没有设置用户名具有唯一性约束。每当我添加新行时,我只需要电子邮件是唯一的,用户名可以重复.如何做到这一点??

【问题讨论】:

也许它使用第一列作为主键? 纯属猜测 - 我对这个问题更感兴趣,而不是成为该主题的专家 - 抱歉 我不这么认为,前一个具有相同用户名的对象有一个“_id”属性,我认为它是主键。像这样 "UserName": "ann", "Email": "ann@f.com", "UserType": "normaluser", "Password":"123456" "_id": "5056d1c7e71c8a0c150003b3" 【参考方案1】:

@ManseUK 可能是对的,看起来 UserName 是一个“键”——在这种情况下是一个索引。 _id 属性是默认创建的“主”索引,但 mongodb 允许您拥有多个。

启动一个mongo控制台并运行medinfo.users.getIndexes()?一定是某些东西在“用户名”上添加了索引。

required: true 不会这样做,但您之前可能玩过其他设置并且索引没有被删除?

【讨论】:

是的,在用户(集合)上创建了一个索引,我使用medinfo.users.getIndexes() 列出了用户上的索引并删除了用户名上的索引。这解决了问题。 您也可以在 mongoDB 指南针应用程序中执行此操作,方法是转到您的收藏并单击“索引”选项卡。从那里您可以删除要避免此错误的字段。【参考方案2】:

应该有一个被阻塞的索引。

你可以试试 db.collection.dropIndex() 方法

medinfo.users.dropIndexes()

【讨论】:

【参考方案3】:

我在我的项目中遇到了类似的问题。我试图清除所有文件,但 dup 问题仍然不断出现。直到我删除了这个集合并重新启动了我的节点服务,它才正常工作。

【讨论】:

【参考方案4】:

我意识到我的数据结构正在发生变化——这就是versioning 派上用场的地方。

您可能需要获取mongoose-version 模块,执行thing.remove(, ...) 甚至删除集合:drop database with mongoose

我使用 RoboMongo 作为管理工具(我强烈推荐它!)所以我只是进入并从控制台右键单击/删除集合。

如果有人知道如何在代码中轻松地对集合进行版本化和/或删除,请随时在下面发表评论,因为它肯定有助于这个线程(和我:))。

【讨论】:

【参考方案5】:

此错误背后的原因是,索引在您尝试插入的集合中不存在或不同。 所以解决方案是删除该集合并再次运行您的程序。

【讨论】:

以上是关于MongoError,err:E11000 重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

MongoError:E11000 重复键错误集合:myFirstDatabase.tours 索引:rating_1 重复键: rating:null

MongoError: E11000 重复键错误索引

我该如何修复(节点:14352)UnhandledPromiseRejectionWarning:MongoError:E11000 重复键错误集合:错误?

MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null

Node.js MongoError: E11000 重复键错误集合:

带有 upsert 的 Mongoose 重复键错误