Javascript Mongoose返回错误代码11000重复索引
我正在使用mongoose作为我项目的数据库,现在我正在努力向多个集合添加数据,这就是我的路线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
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级别(保存/更新之前),它只是删除架构中不存在的所有字段。