E11000重复键错误集合:reklamaswin.ads index:username_1 dup key:{:null}

时间:2018-02-11 15:43:10

标签: node.js mongodb

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

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'
    }
  ]
});

2 个答案:

答案 0 :(得分:0)

如果不知道您的收集索引是什么,很难确切地说出来,但是看起来有一个名为username_1的广告收藏集的索引。具有此名称格式的索引通常由Mongoose在字段上设置index: true时创建。在这种情况下,显然广告架构上有一个username字段index: true

此外,null消息表明此字段为null的索引条目存在 - 预期,因为广告集合中不再存在该字段。因此,任何新记录也会为此字段设置null值,因此会产生重复键错误。

如果此假设为真,则修复方法是删除广告集合上的username_1索引。

答案 1 :(得分:0)

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