var UserSchema = new Schema({
"username": {type: String, unique: true },
"password": String,
})
所以我将属性名称更改为用户名,从那以后事情就变成了SHIT。
无论我做什么,我都会收到错误
E11000重复键错误索引:test.users。$ name_1 dup key:{:null}
即使我尝试删除数据库,更改连接到的数据库的名称,并从架构中删除unique:true,我仍然得到这个错误。
无论我做什么,我都无法删除此错误,为什么即使在删除每个数据库并删除唯一属性后它仍然会抛出此错误...
这是保存功能 -
router.post('/register', function(req, res){
var user = new User();
user.username = req.body.username;
//hash the password
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(req.body.password, salt, function(err, hash) {
user.password = hash;
user.save(function(err){
if(err){
console.log(err.message);
if(err.message === "E11000 duplicate key error index: test.users.$name_1 dup key: { : \"" + user.username + "\" }"){ //this was working fine before i changed user.name to user.username
res.json({
error: "name already taken"
});
}else{
res.json({
error: "There was an error processing your registration."
});
}
return(err);
}
res.json({user: user});
})
});
});
});
答案 0 :(得分:2)
该错误似乎是因为您已经将名称(或用户名)属性的文档插入为null。 由于用户名上有唯一索引,因此您只能拥有一个空用户名的文档。
看到这个问题:
E11000 duplicate key error index in mongodb mongoose
此外,如果从Mongoose模式中删除{unique:true},则不会将其从数据库中删除。你也必须实际从Mongo中删除索引 - 索引仍然存在,你的Mongoose Schema将无法确保启动时有索引。 Mongoose将在启动时在MongoDB中运行ensureIndex(),以确保该字段已编入索引,但从Mongoose中删除它实际上并不是从Mongo中删除它,必须手动完成。
答案 1 :(得分:0)
基本上,这就是说你有一个带有Name属性的文档,其值为" null"。也许你还有一些带有该属性的文档,或者仍然在某个地方引用了name属性?这是来自mongo docs
如果文档没有唯一的索引字段值 index,索引将为此文档存储空值。因为 独特的约束,MongoDB只允许一个文件 缺少索引字段。如果有多个文档没有 索引字段的值或缺少索引字段,索引 构建将因重复键错误而失败。
答案 2 :(得分:0)
从来没有能够真正解决问题,我所做的就是删除我的数据文件夹并重新创建它。