Node.js E11000重复密钥错误集合:reklamaswin.ads索引:用户名\u 1重复密钥:{:null}

Node.js E11000重复密钥错误集合:reklamaswin.ads索引:用户名\u 1重复密钥:{:null},node.js,mongodb,Node.js,Mongodb,为什么我会犯这个错误?E11000复制密钥错误集合:reklamaswin.ads索引:username_1 dup key:{:null}当我想制作新广告时。我知道某个地方存在重复密钥,但我找不到问题所在。以下是我在项目中使用的模式和转到“/new”的post请求。我正在创建一个新广告,并将其存储在ads集合中,然后将其推送到req.user的user.ads中 router.post('/new',middleware.isLoggedIn,函数(req,res){ 上传(请求、恢复、功能

为什么我会犯这个错误?E11000复制密钥错误集合:reklamaswin.ads索引:username_1 dup key:{:null}当我想制作新广告时。我知道某个地方存在重复密钥,但我找不到问题所在。以下是我在项目中使用的模式和转到“/new”的post请求。我正在创建一个新广告,并将其存储在ads集合中,然后将其推送到req.user的user.ads中

router.post('/new',middleware.isLoggedIn,函数(req,res){
上传(请求、恢复、功能(错误){
如果(错误){
请求闪存(“错误”,错误消息);
返回res.redirect('/new');
}
var ad=新ad({
横幅:'/uploads/'+req.file.filename,
url:req.user.url,
paymentType:req.body.paymentType,
transactionId:req.body.transactionId
});
ad.save(函数(err,ad){
如果(错误){
请求闪存(“错误”,错误消息);
返回res.redirect('/new');
}
User.findById(请求用户id,函数(err,User){
如果(错误){
请求闪存(“错误”,错误消息);
返回res.redirect('/new');
}
user.ads.push(广告);
user.save(函数(err,ad){
如果(错误){
请求闪存(“错误”,错误消息);
返回res.redirect('/new');
}
请求flash(“成功”,“成功添加新广告”);
res.redirect('/');
});
});
});
});

});
如果不知道你的收藏索引是什么,就很难准确判断,但似乎有一个名为
username\u 1
的广告收藏索引。具有此名称格式的索引通常由Mongoose在字段上设置
index:true
时创建。在这种情况下,显然在Ads模式的某个点上有一个
username
字段,带有
index:true

此外,
null
消息表示存在索引项,其中该字段为
null
——这是预期的,因为该字段在Ads集合中不再存在。因此,对于该字段,任何新记录也将有一个
null
值,因此将创建一个重复的键错误

如果这一假设成立,那么解决办法就是删除Ads集合上的
username\u 1
索引

E11000 duplicate key error collection: reklamaswin.ads index: username_1 dup key: { : null }
  • 此错误表示集合
    reklamaswin.ads
  • 索引似乎是唯一的,因此所有具有
    username
    null
    的文档都会在唯一性方面产生冲突
  • 解决此问题的一种方法是找出所有未设置
    用户名的文档,然后设置它
  • 此外,还可以选择删除索引

您好,但我的ads集合中没有用户名索引,您可以在顶部看到。@AmirŠaran提供的代码只显示您当前的模式,而不是mongoDB实际拥有的模式。这将包括由以前版本的或针对同一mongoDB实例运行的其他代码创建的索引和集合。如果您要直接检查mongoDB实例,那么您将看到这些索引。