E11000 重复键错误收集: reklamaswin.ads 索引: username_1 dup 键: { : nu



为什么会出现此错误?E11000 重复键错误收集: reklamaswin.ads 索引: username_1 dup 键: { : null } 当我想制作一个新广告时。我知道某处有重复项,但我找不到问题出在哪里。这是我在项目中使用的架构以及转到"/new"的 post 请求。我正在创建一个新广告并将其存储在广告集合中,然后将其推送到 user.ads 中以供 req.user

使用

router.post('/new', middleware.isLoggedIn, function(req, res) {
upload(req, res, function(err) {
if (err) {
req.flash('error', err.message);
return res.redirect('/new');
}
var ad = new Ad({
banner: '/uploads/' + req.file.filename,
url: req.user.url,
paymentType: req.body.paymentType,
transactionId: req.body.transactionId
});
ad.save(function(err, ad) {
if (err) {
req.flash('error', err.message);
return res.redirect('/new');
}
User.findById(req.user._id, function(err, user) {
if (err) {
req.flash('error', err.message);
return res.redirect('/new');
}
user.ads.push(ad);
user.save(function(err, ad) {
if (err) {
req.flash('error', err.message);
return res.redirect('/new');
}
req.flash('success', 'Successfully added new ad.');
res.redirect('/');
});
});
});
});
});

这是广告架构。

var AdSchema = new mongoose.Schema({
banner: String,
likes: {
type: Number,
default: 0
},
url: String,
paymentType: {
type: String,
default: 'free'
},
transactionId: String,
sponsored: {type: Boolean, default: false}
});

这是用户架构。

var UserSchema = new mongoose.Schema({
username: {
type: String,
trim: true
},
email: {
type: String,
trim: true,
unique: true
},
password: String,
joined: {
type: Date,
default: Date.now
},
siteRole: {
type: String,
default: 'user'
},
ads: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'Ad'
}
]
});

E11000 duplicate key error collection: reklamaswin.ads index: username_1 dup key: { : null }
  • 此错误表示收集reklamaswin.ads上存在username索引
  • 索引似乎是唯一的,因此所有具有usernamenull的文档都会在唯一性上产生冲突。
  • 解决此问题的一种方法是找出所有未设置username的此类文档并对其进行设置
  • 此外,您可以选择删除索引

不知道您的集合索引是什么,很难准确判断,但似乎有一个名为username_1的广告集合索引。具有此名称格式的索引通常由 Mongoose 在字段上设置index: true时创建。在这种情况下,显然在某个时候,Ads 架构上有一个index: trueusername字段。

此外,null消息指示null此字段的位置存在索引条目 - 这是意料之中的,因为该字段不再存在于广告集合中。因此,任何新记录也将具有此字段的null值,因此会产生重复键错误。

如果此假设成立,则解决方法是删除广告集合上的username_1索引。

最新更新