Mongoose经常返回e11000 error的原因分析
短信预约 -IT技能 免费直播动态提醒
发现问题
最近在工作中遇到了一个问题,在定义了schema之后,每一次save都会报E11000,但是db.xxx.find()里面根本就没有冲突的条目,什么情况呢?
问题分析
可能问题出在定义的schema的成员使用了unique,比如:
var CatalogSchema = new Schema({
idCat: {
type: String,
default: '',
trim: true,
unique: 'Id should be unique!',
required: 'Id cannot be blank'
},
titleCat: {
type: String,
default: '',
trim: true,
unique: 'Title should be unique!',
required: 'Title cannot be blank'
}
});
mongoose.model('Catalog', CatalogSchema);
unique表示,不能冲突,迷惑的地方就是,没有冲突啊,其实还有一种可能,或许你压根想不到,就是确实冲突了,因为你给成员改名了。
用mongodb的命令行工具查看就知道:
> db.catalogs.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ocr-dev.catalogs"
},
{
"v" : 1,
"unique" : true,
"key" : {
"name" : 1
},
"name" : "name_1",
"ns" : "ocr-dev.catalogs",
"background" : true
},
{
"v" : 1,
"unique" : true,
"key" : {
"title" : 1
},
"name" : "title_1",
"ns" : "ocr-dev.catalogs",
"background" : true
},
{
"v" : 1,
"unique" : true,
"key" : {
"idCat" : 1
},
"name" : "idCat_1",
"ns" : "ocr-dev.catalogs",
"background" : true
},
{
"v" : 1,
"unique" : true,
"key" : {
"titleCat" : 1
},
"name" : "titleCat_1",
"ns" : "ocr-dev.catalogs",
"background" : true
}
]
问题解决
里面的name和title就是之前的名字,改成了idCat和titleCat,但是成员还是会在mongodb里面,所以,你要做的就是删除这个collection然后在重新运行mongoose了:
> db.catalogs.drop()
false
> db.catalogs.getIndexes()
[ ]
然后再在代码里面插入就不会有问题了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程网的支持。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341