30

我有一个像这样的 MongoDb 架构

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

我正在尝试创建一个新用户 这是在 NodeJs 中使用猫鼬 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}}

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

4

5 回答 5

28

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

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

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

于 2012-11-19T13:27:03.133 回答
11

应该有一个阻塞的索引。

您可以尝试 db.collection.dropIndex() 方法

medinfo.users.dropIndexes()

于 2014-07-12T04:58:23.980 回答
1

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

于 2016-09-08T06:50:20.747 回答
0

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

你可能需要获取一个mongoose-version模块,做一个thing.remove({}, ...)甚至删除集合:drop database with mongoose

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

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

于 2014-04-03T09:42:25.353 回答
-1

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

于 2018-10-31T12:08:45.680 回答