首页 文章

如何绕过E11000 MongoError而不删除'unique: true'

提问于
浏览
0

我正在尝试 Build 一个论坛,以便学习MEAN堆栈 . 我在使用猫鼬时遇到了一个问题......

我有这个...

var UserSchema = new Schema({
  id: ObjectId,
  firstName: String,
  lastName: String,
  role: String,
  email: {
    type: String,
    unique: true
  },
  password: String,
  workers: [WorkerSchema]
});

var TopicSchema = new Schema({
  id: ObjectId,
  title: String,
  moderator: UserSchema,
  posts: [PostSchema]
});

var Topic = mongoose.model('Topic', TopicSchema);

app.post('/topics', requireLogin, function(req, res) {
  User.findOne({"email": req.session.user.email}, function(err, user) {
    if (user.role == "moderator" || user.role == "admin") {
      var topic = new Topic({
        title: req.body.title,
        moderator: req.session.user,
        posts: []
      });
      topic.save(function(err) {
        if (err) console.log(err);
        res.status(204).end();
      });
    }
  });
});

我的问题是这个......当我将主题发布到/ topics时,它第一次工作,用一个项目填充主题集合 . 但是,当我再次向同一用户发送/主题时,我得到一个E11000 MongoError,如下所示:message:'E11000重复键错误索引:MY_MONGO_DB.topics . $ moderator.email_1 dup key:{:“myuser @ example.com“}'

我知道从UserSchema的电子邮件字段中删除'unique:true'属性可以解决此问题,但我不想删除该唯一性属性,因为我在代码中的其他位置使用它以确保用户通过电子邮件是唯一的 .

有没有办法解决?换句话说,有没有办法保持'unique:true'属性并保留用户能够发布多个主题而不会触发E11000错误的能力?

1 回答

  • 1

    你做的是to embed用户 . 在您的数据库中,生成的文档看起来像

    {
      ...
      moderator: {..., email: "john@example.com"}
    }
    

    当然,如果您与主持人的人数相同,则会违反唯一约束 .

    你应该做的是在你的架构中reference the user

    var user = mongoose.model('User', UserSchema);
    
    var TopicSchema = new Schema({
      id: ObjectId,
      title: String,
      moderator: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
      posts: [PostSchema]
    });
    

相关问题