Mongoose 错误 "MongoError: E11000 duplicate key error" 的解决方案
MongoDB 是一个非常流行的文档型数据库,在 Node.js 项目中常常使用 Mongoose 进行操作,提供了方便的 API 进行增删改查等操作。然而,在开发过程中我们可能会遭遇到 "MongoError: E11000 duplicate key error" 这样的错误,当你试图插入一条文档时 MongoDB 会提示你存在重复的键。
这个错误在开发中非常常见且难以排查,接下来我们将详细探讨这个错误及解决方案。
错误原因
在 MongoDB 文档中,每个文档都有一个唯一性索引,当我们在插入一条数据时有可能会导致唯一性索引的键值重复。这种情况下 MongoDB 会抛出 "MongoError: E11000 duplicate key error" 这样的错误。
例如,我们在定义一个用户模型时,将 username 字段设置为唯一性索引,如果两次插入的数据中 username 的值相同,则会出现 "MongoError: E11000 duplicate key error" 的错误。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- --------- - ----- ------- ------- ---- -- --------- ------- ------ ------ --- ----- ---- - ---------------------- ------------ ----- ----- - --- ------ --------- --------- --------- --------- ------ -------------------- --- ---------------- -- - -- ----- ----------------- --- ----- ----- - --- ------ --------- --------- --------- --------- ------ --------------------- --- ---------------- -- - -- ----- ----------------- ---
当执行以上代码时,我们可以看到控制台输出 "MongoError: E11000 duplicate key error" 的错误,因为我们试图插入两条相同 username 的数据。
解决方案
在我们遭遇 "MongoError: E11000 duplicate key error" 错误时,我们需要对这个错误进行解决。常用的解决方案包括以下几种。
方案一:捕获错误
我们可以在保存数据时捕获错误,并对错误进行处理,最常见的处理方式是提示用户输入不重复的键值。
-- -------------------- ---- ------- ----- ----- - --- ------ --------- --------- --------- --------- ------ --------------------- --- ---------------- -- - -- ----- - -- --------- --- ------ - ------------------------ - ---- - ----------------- - - ---
使用上述代码保存数据时,我们可以看到在控制台输出 "该用户名已被占用",而不是 "MongoError: E11000 duplicate key error"。
方案二:设置错误监听器
我们可以在 Mongoose 对象上设置错误监听器,将 "MongoError: E11000 duplicate key error" 错误统一处理。
mongoose.connection.on('error', (err) => { if (err.code === 11000) { console.log('重复的键值'); } else { console.log(err); } });
上述代码定义了一个 MongoDB 连接的错误监听器,当 MongoDB 抛出错误时就会在控制台输出 "重复的键值",而不是 "MongoError: E11000 duplicate key error"。
方案三:使用 findOneAndUpdate 方法
我们可以使用 Mongoose 提供的 findOneAndUpdate 方法插入数据,该方法会先查找是否存在符合条件的文档,如果存在则更新,否则插入。
User.findOneAndUpdate({ username: 'gaston' }, { email: 'gaston2@example.com' }, { upsert: true, new: true }, (err, doc) => { if (err) console.log(err); else console.log(doc); });
上述代码使用 findOneAndUpdate 方法插入数据,如果数据库中不存在 username 为 gaston 的文档,则会插入一条新数据,否则会更新 email 字段。upsert 选项表示在文档不存在时创建一个新文档,new 选项表示返回新文档而非旧文档。
学习和指导意义
"MongoError: E11000 duplicate key error" 错误是开发中非常常见的错误之一,在使用 Mongoose 操作 MongoDB 时特别容易出现。我们可以使用上述三种解决方案解决这个问题,其中最好的方法是使用 findOneAndUpdate 方法插入数据。
了解并学会处理 "MongoError: E11000 duplicate key error" 错误可以提升我们的开发经验和能力,让我们更加熟练使用 Mongoose 并减少开发过程中的错误。
最后,建议我们在定义数据模型时尽可能使用唯一性索引并在数据库操作时进行错误处理。这样可以避免重复键值的出现并更好的处理错误情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cebbb2e46428fe9e958a6a