在 Mongoose 中调试 E11000 错误
MongoDB 的 E11000 错误 是一个常见的混淆来源。 当两个文档具有的字段的相同值 定义为 unique
在您的 Mongoose 架构 中。
Mongoose models 有一个 _id
的领域 总是独一无二 。 如果您尝试插入两个相同的文档 _id
,您会收到以下错误消息。
MongoError: E11000 duplicate key error collection: test.customers index: _id_
dup key: { : ObjectId('5cc5ea092dca872442916cf5') }
这 test.customers
部分表示发生错误的 MongoDB 集合。 _id_
string 是唯一索引的名称,并且 ObjectId()
是重复值。
以下代码是您可能会收到上述错误消息的一种方式。 MongoDB 集合总是有一个唯一的索引 _id
,所以试图插入一个文档具有重复 ID 将导致重复键错误。
const CharacterModel = mongoose.model('Character',
new Schema({ name: String }));
const doc = await CharacterModel.create({ name: 'Jon Snow' });
doc._id; // Something like "5cc5e9be172acd237a893610"
try {
// Try to create a document with the same `_id`. This will always fail
// because MongoDB collections always have a unique index on `_id`.
await CharacterModel.create(Object.assign({}, doc.toObject()));
} catch (error) {
// MongoError: E11000 duplicate key error collection: test.characters
// index: _id_ dup key: { : ObjectId('5cc5ea092dca872442916cf5') }
error.message;
}
这个错误通常是由 null
要么 undefined
字段值。 null
和 undefined
算作不同的值,所以如果你声明一个字段 email
作为唯一的,两个文件不能有 email = undefined
. 下面的示例 创建 两个没有 email
属性,这会导致重复键错误。
const UserModel = mongoose.model('User', new Schema({
name: String,
email: {
type: String,
unique: true
}
}));
// Wait for the index to build. The index name will be `email_1`
await UserModel.init();
// Create a document with no `email` set
await UserModel.create({ name: 'user 1' });
try {
await UserModel.create({ name: 'user 2' });
} catch (error) {
// E11000 duplicate key error collection: test.users index: email_1
// dup key: { : null }
error.message;
}
要使 MongoDB E11000 错误消息对用户友好,您应该使用 mongoose -beautiful-unique-validation 插件 。
const schema = new Schema({ name: String });
schema.plugin(require('mongoose-beautiful-unique-validation'));
const CharacterModel = mongoose.model('Character', schema);
const doc = await CharacterModel.create({ name: 'Jon Snow' });
try {
// Try to create a document with the same `_id`. This will always fail
// because MongoDB collections always have a unique index on `_id`.
await CharacterModel.create(Object.assign({}, doc.toObject()));
} catch (error) {
// Path `_id` (5cc60c5603a95a15cfb9204d) is not unique.
error.errors['_id'].message;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论