如何在不删除 'unique: true' 的情况下绕过 E11000 MongoError

How to get around E11000 MongoError without deleting 'unique: true'

我正在尝试建立一个论坛以学习 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();
      });
    }
  });
});

我的问题是...当我 POST 一个主题到 /topics 时,它第一次工作,用一个项目填充主题集合。但是,当我再次从同一个用户 POST 到 /topics 时,我得到一个 E11000 MongoError,如下所示: 消息:'E11000 duplicate key error index: MY_MONGO_DB.topics.$moderator.email_1 dup key: { : "myuser@example.com" }'

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

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

你所做的是 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]
});