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

时间:2016-05-03 05:51:38

标签: node.js mongoose mean-stack mongoose-schema

我正在尝试建立一个论坛,以便学习MEAN堆栈。我在使用mongoose时遇到了一个问题...

我有这个......

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();
      });
    }
  });
});

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

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

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

1 个答案:

答案 0 :(得分: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]
});