在 Mongoose 中调试 E11000 错误

发布于 2022-05-17 12:38:51 字数 3293 浏览 1075 评论 0

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字段值。 nullundefined算作不同的值,所以如果你声明一个字段 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

gitee_Wlm8Q1npDj

暂无简介

0 文章
0 评论
370 人气
更多

推荐作者

遂心如意

文章 0 评论 0

5513090242

文章 0 评论 0

巷雨优美回忆

文章 0 评论 0

junpengz2000

文章 0 评论 0

13郎

文章 0 评论 0

qq_xU4RDg

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文