E11000在mongodbmongoose中重复键错误索引
以下是我在user.js
模型中的user
架构 –
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;
这是我如何在我的控制器中使用它 –
var user = require('./../models/user.js');
这是我如何保存在数据库 –
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"}); } });
错误 –
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
我检查了数据库集合,没有这样的重复条目存在,让我知道我在做什么错了?
FYI – req.body.email
和req.body.password
获取值。
我也检查了这个post,但没有帮助堆栈链接
编辑
如果我完全删除然后插入文件,否则它会引发错误“重复”的错误,即使我在本地邮件中的条目
错误消息是说已经有一个null
的logging作为电子邮件。 换句话说,你已经有一个没有电子邮件地址的用户。
有关这方面的文件:
如果文档在唯一索引中没有索引字段的值,则索引将为此文档存储空值。 由于唯一的约束,MongoDB将只允许一个缺less索引字段的文档。 如果有多个文档没有索引字段的值或缺less索引字段,则索引构build将失败,并出现重复键错误。
您可以将唯一约束与稀疏索引组合,以便从唯一索引过滤这些空值,并避免错误。
独特的索引
即使索引字段包含空值,稀疏索引也只包含具有索引字段的文档的条目。
换句话说,对于多个文档都有null
值的稀疏索引是可以的。
稀疏的指标
如果你仍然在你的开发环境中,我会放弃整个数据库,并重新开始新的模式。
从命令行
➜ mongo use dbName; db.dropDatabase(); exit
检查收集索引。
由于过期的字段集合中的索引,我有这个问题,应该由不同的新path存储。
当您将字段指定为唯一时,Mongoose会添加索引。
当在当前数据库中有频繁的模式索引和更改时,会发生这种情况,通过删除系统索引和整个集合可以很容易地解决这个问题。
它在这样做之后起作用,当没有用于将两个文档彼此分开的唯一密钥时也会发生这种情况。
如果你使用的是shell,那么你可以通过 –
db.users.drop();
我希望这有助于:)
这是我的相关经验:
在“用户”模式中,我将“名称”设置为唯一键,然后运行一些执行,我认为这已经build立了数据库结构。
然后我把这个唯一的键改成了'用户名',并且在我把数据保存到数据库时不再传递'name'的值。 所以mongodb会自动将新logging的'name'值设置为null,这是重复键。 为了覆盖原始设置,我在'用户'模式中尝试将'名称'键设置为不是唯一键{name: {unique: false, type: String}}
。 但是,它没有工作。
最后,我做出了自己的解决scheme:
只要设置一个随机的键值,当你保存你的数据logging时,这个键值不会重复到'name'键。 简单的math方法'' + Math.random() + Math.random()
产生一个随机的string。
我有一个类似的问题,什么解决了它意识到,默认情况下,每个集合只支持一个模式。 将您的新架构存储在其他集合中,或者删除当前集合中具有不兼容架构的现有文档。 或者find一种方法来为每个集合使用多个模式。
这是因为已经有一个与configuration同名的集合。只需通过mongo shell从你的MongoDB中删除集合,然后再试一次。
db.collectionName.remove()
现在运行你的应用程序它应该工作
我面临类似的问题,我只是清除特定领域的指标,然后对我的作品。 https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
当我在config / models.js中有以下configuration时,我得到了同样的问题
module.exports.models = { connection: 'mongodb', migrate: 'alter' }
更改从“更改”迁移到“安全”修复了我。
module.exports.models = { connection: 'mongodb', migrate: 'safe' }
在首先构build一些保存索引之后从模式中删除属性之后的相同问题。 从模式中删除属性会导致非现有属性的空值,该值仍然具有索引。 删除索引或从头开始一个新的集合帮助这里。
注意:在这种情况下,错误信息将会引导你。 它有一条不再存在的path。 即时通讯我的情况旧的path是… $ uuid_1(这是一个索引!),但新的是…. * priv.uuid_1
我遇到过同样的问题。 试过不同的方式debugging无法弄清楚。 我尝试删除集合,并在那之后正常工作。 尽pipe如果您的馆藏有许多文件,这不是一个好的解决办法。 但是如果你处于早期的发展阶段,那就试试收集。
db.users.drop();
当我试图修改使用mangoose定义的模式时,我遇到了同样的问题。 我认为这个问题是由于创build一个集合像描述对用户隐藏的索引(至less在我的情况下)是有一些底层的过程的原因。所以我发现最好的解决scheme是把整个集合并重新开始。
请清除集合或从MongoDB数据库中删除整个集合,稍后再试。