【问题标题】:Mongoose Return Error Code 11000 duplicate indexMongoose 返回错误代码 11000 重复索引
【发布时间】:2021-02-11 02:08:36
【问题描述】:

我正在使用猫鼬作为我的项目的数据库,现在我正在努力将数据添加到多个集合中,这是我的路线

router.post('/',add_new_user_to_specific_collection,add_new_user_to_collection_User);

这是中间件代码add_new_user_to_specific_collection:

exports.add_new_user_to_specific_collection = (req, res, next) => {
  const {role, fullname, code} = req.body;

  const generator = new AvatarGenerator(); // it generate random image, no worry
  const hashedPassword = bcrypt.hashSync(code.toString(), 10);
  console.log(hashedPassword);
  const newUserData = {
    password: hashedPassword,
    profileImage: generator.generateRandomAvatar(),
  };

  if (role === 'consultant') {
    var newConsultant = new Consultant({
      fullname,
      _id: new mongoose.Types.ObjectId(),
      fullname,
      code,
      vnumail: code.trim() + '@vnu.edu.vn',
      ...newUserData,
    });

    newConsultant
      .save()
      .then((doc) => {
        console.log('New User as Consultant was added');
        req.newUserData = newUserData;
        next();
      })
      .catch((err) => {
        res.status(500).json({err});
      });
  }
};

这是给add_new_user_to_collection_User的:

exports.add_new_user_to_collection_User = (req, res, next) => {
  const {role, fullname, code} = req.body;

  const newUser = new User({
    _id: new mongoose.Types.ObjectId(),
    role,
    fullname,
    code,
    vnumail: code.trim() + '@vnu.edu.vn',
    ...req.newUserData,
  });

  newUser
    .save()
    .then((doc) => {
      console.log('New User added to collection User');
      return res.status(200).json({
        message: 'User added',
        doc,
      });
    })
    .catch((error) => {
      console.log(error);
      res.status(500).json(error);
    });
};

输入数据已完全验证,

在第一次尝试时,它工作得很好,但是当涉及到第二次时,我得到了这个错误:

{
  "err.driver": true,
  "err.name": "MongoError",
  "err.index": 0,
  "err.code": 11000,
  "err.keyPattern.email": 1,
  "err.keyValue.email": null
}

我已经研究了一段时间,看起来电子邮件被重复了,但我没有从前端的正文中分配任何 email 属性

更新:这是我的架构

userSchema:

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  code: {
    type: String,
    required: true,
    unique: true,
  },
  fullname: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  activated: {
    type: Boolean,
  },
  vnumail: {
    type: String,
    required: true,
    unique: true,
    match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/,
  },
  profileImage: {
    type: String,
    default:
      'https://kittyinpink.co.uk/wp-content/uploads/2016/12/facebook-default-photo-male_1-1.jpg',
  },

  role: {
    type: String,
    required: true,
    enum: [
      'consultant',
      'parent',
      'student',
      'specialist',
      'uet-leader',
      'student-affair-leader',
      'academic-leader',
    ],
    default: 'student',
  },
});

const User = mongoose.model('User', userSchema);

module.exports = User;

consultantSchema:

const mongoose = require('mongoose');
const consultantSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  fullname: {
    type: String,
    required: true,
  },
  code: {
    type: String,
    required: true,
  },
  gender: {
    type: String,
    required: true,
    enum: ['Male', 'Female', 'No Record'],
    default: 'No Record',
  },
  birthday: {
    type: Date,
  },
  email: {
    type: String,
    unique: true,
    match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/,
  },
  vnumail: {
    type: String,
    required: true,
    unique: true,
    match: /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/,
  },
  profileImage: {
    type: String,
  },
  address: {
    type: String,
  },
  academicRank: {
    type: String,
    required: true,
    enum: ['master', 'phd', 'professor'],
    default: 'master',
  },
  specialize: {
    type: String,
  },
});

const Consultant = mongoose.model('Consultant', consultantSchema);

module.exports = Consultant;

非常感谢你帮助我,这对我来说意义重大,我希望你有一个美好的一天

【问题讨论】:

    标签: javascript web mongoose duplicates backend


    【解决方案1】:

    未在我的本地测试,但从代码看来,您遇到了错误,因为您从未为 Consultant 的 email 字段分配任何值,而它(几乎)必须分配。

    更准确地说,问题(很可能是需要修复的地方)在这里:

    var newConsultant = new Consultant({
      fullname,
      _id: new mongoose.Types.ObjectId(),
      fullname,
      code,
      vnumail: code.trim() + '@vnu.edu.vn',
      ...newUserData,
    });
    

    您在具有各种属性的对象上创建(顺便说一下,您复制了两次 fullname)但未设置 email。如果未设置,您只能保存到数据库一次,因为 null 值仍然可以接受,但第二次插入时,您会收到错误,因为 null 不再是唯一值。

    要解决这个问题,您需要为email字段分配一个唯一值,例如:

    var newConsultant = new Consultant({
      fullname,
      _id: new mongoose.Types.ObjectId(),
      email: <some_random_and_unique_email>,
      code,
      vnumail: code.trim() + '@vnu.edu.vn',
      ...newUserData,
    });
    

    如果 email 不一定是必需的/唯一的,那么您需要更新 consultantSchema 并删除 unique: trueforemail` 字段。

    【讨论】:

    • 非常感谢,我只是按照你告诉我的,它工作,但我不明白为什么,我没有在架构用户中分配属性“电子邮件”,但我必须分配一个,它会神奇地工作
    • @TamDo 这里没有魔法。 User 架构不包含 email 字段,因此无需分配即可工作。事实上,如果架构中没有 email 字段,即使您在代码中分配了值,Mongoose 甚至都不会将此字段保存到数据库中。
    • 但这会让我感到困惑,因为我分配了一个架构中不存在的属性以使其工作:(
    • 您可以使用任何字段附加到对象,它似乎可以正常工作,但在 Mongoose 级别(保存/更新之前),它只是删除了架构中不存在的所有字段。
    猜你喜欢
    • 2017-01-03
    • 2017-05-25
    • 2013-08-03
    • 2016-10-31
    • 2018-02-02
    • 2020-09-29
    • 2014-04-16
    • 2018-01-19
    相关资源
    最近更新 更多