Javascript Mongoose返回错误代码11000重复索引

Javascript Mongoose返回错误代码11000重复索引,javascript,web,mongoose,duplicates,backend,Javascript,Web,Mongoose,Duplicates,Backend,我正在使用mongoose作为我项目的数据库,现在我正在努力向多个集合添加数据,这就是我的路线 router.post(“/”,将新用户添加到特定集合,将新用户添加到集合用户) 这是中间件的代码将新用户添加到特定的集合中: exports.add_new_user_to_specific_collection = (req, res, next) => { const {role, fullname, code} = req.body; const generator = new

我正在使用mongoose作为我项目的数据库,现在我正在努力向多个集合添加数据,这就是我的路线

router.post(“/”,将新用户添加到特定集合,将新用户添加到集合用户)

这是中间件的代码
将新用户添加到特定的集合中

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});
      });
  }
};
这是为
将新用户添加到集合用户

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
}
我已经研究了一段时间,看起来电子邮件是重复的,但我没有从frontend的正文中分配任何
电子邮件
属性

更新:这是我的模式

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;
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;
consultschema

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;
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;

非常感谢您对我的帮助,这对我来说意义重大,我希望您有一个愉快的一天

没有在我的本地测试,但从代码来看,您似乎收到了一个错误,因为您从未为
顾问的
电子邮件
字段分配任何值,而它(几乎)必须分配

更准确地说,问题(最可能出现在需要修复的地方)在于:

您使用各种属性在对象上创建(顺便说一句,您复制了两次
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,
});
var newConsultant=新顾问({
全名,
_id:new mongoose.Types.ObjectId(),
电邮:,
代码,
vnumail:code.trim()+'@vnu.edu.vn',
…新用户数据,
});

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

非常感谢您,我只是按照您告诉我的方法进行了操作,但我无法获得它为什么,我没有分配属性“email”在模式用户中,但我必须分配一个,它可以工作magically@TamDo这里没有魔法<代码>用户
架构不包含
电子邮件
字段,因此它在不分配字段的情况下工作。事实上,如果架构中没有
email
字段,Mongoose甚至不会将此字段保存到数据库,即使您在代码中指定了一个值。但这会让我感到困惑,因为我指定了一个架构中不存在的属性使其工作:(您可以使用任何字段将其附加到对象,它似乎正在工作,但在Mongoose级别(保存/更新之前),它只是删除架构中不存在的所有字段。