Following is my user
schema in user.js
model –
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;
This is how I am using it in my controller –
var user = require('./../models/user.js');
This is how I am saving it in the db –
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"});
}
});
Error –
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
I checked the db collection and no such duplicate entry exists, let me know what I am doing wrong ?
FYI – req.body.email
and req.body.password
are fetching values.
I also checked this post but no help STACK LINK
If I removed completely then it inserts the document, otherwise it throws error "Duplicate" error even I have an entry in the local.email
Best Answer
The error message is saying that there's already a record with
null
as the email. In other words, you already have a user without an email address.The relevant documentation for this:
unique indexes
In other words, a sparse index is ok with multiple documents all having
null
values.sparse indexes
From comments:
Your error says that the key is named
mydb.users.$email_1
which makes me suspect that you have an index on bothusers.email
andusers.local.email
(The former being old and unused at the moment). Removing a field from a Mongoose model doesn't affect the database. Check withmydb.users.getIndexes()
if this is the case and manually remove the unwanted index withmydb.users.dropIndex(<name>)
.