【问题标题】:How to get around E11000 MongoError without deleting 'unique: true'如何在不删除“唯一:真”的情况下绕过 E11000 MongoError
【发布时间】:2016-08-28 01:15:51
【问题描述】:

我正在尝试建立一个论坛来学习 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 时,它第一次工作,用一个项目填充主题集合。但是,当我再次从同一个用户发布到 /topics 时,我得到一个 E11000 MongoError,如下所示: 消息:'E11000 重复键错误索引:MY_MONGO_DB.topics.$moderator.email_1 重复键:{:“myuser@example.com”}'

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

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

【问题讨论】:

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


    【解决方案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]
    });
    

    【讨论】:

    • TopicSchema读取时可以populate用户数据。
    • @str 将其作为社区 wiki 答案,随时根据您的建议进行编辑。
    • 哇。这很有意义。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2014-12-04
    • 2018-11-25
    • 1970-01-01
    • 2011-07-14
    • 2014-11-10
    • 2015-01-13
    相关资源
    最近更新 更多