MongoError:E11000重复键错误索引

时间:2016-10-20 16:46:53

标签: node.js mongodb express mongoose passport.js

我的数据库架构是

ActorSystem

我想使用电子邮件和密码进行护照验证。我的代码是:

var Account = new Schema({
    email : String,
    name : String ,
   family : String ,
   password : String
   });

虽然

中没有任何用户名字段
var LocalStrategy = require('passport-local').Strategy;
passport.use('register', new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback : true
},
function(req, email, password, done) {
        Account.findOne({ 'email' :  email }, function(err, user) {
            if (err)
            {
                return done(err);
            }
                else
                {
                var newaccount = new Account();

                newaccount.password = bcrypt.hashSync(req.body.password);
                newaccount.email = req.body.email;
                newaccount.name = req.body.name;
                newaccount.family = req.body.family;

                // save the user
                newaccount.save(function(err) {
                    if (err)
                    {
                        console.log('Error in Saving user: '+err);
                        throw err;
                    }
               }
        });

我第一次可以在数据库中插入而且我没有任何错误,但第二次我有这个错误,我认为它假定用户名为密钥,并且在第一次将用户名设置为null所以第二次因为重复键,它想要尝试将用户名设置为null throw错误。我在互联网上搜索了很多。我删除数据库并使用MongoError: E11000 duplicate key error index: Account.accounts.$username_1 dup key: { : null } 但问题没有解决。

1 个答案:

答案 0 :(得分:0)

错误消息是因为已存在以null作为用户名的记录。你有一个带有null值的用户名feild.Mongo只允许一个索引的feild具有null值。如果有多个文档没有索引字段的值或者缺少索引字段,索引构建将失败重复键错误。您可以使用稀疏索引。

只需删除空文档。

使用mydb.users.getIndexes()检查您可以使用mydb.users.dropIndex()手动删除不需要的索引