在开发过程中,有时在使用 Mongoose 连接 MongoDB 时,会遇到一个常见的错误 - "MongoError: E11000 duplicate key error collection"。这个错误的原因是 Mongoose 尝试将文档插入到 MongoDB 集合中,但是与现有文档中的某个唯一字段(如 _id)存在重复值,因此 MongoDB 拒绝了插入操作。
解决方案
这个错误有很多可能的解决方案,下面介绍其中的几种:
1. 查找重复的 _id
MongoDB 中的 _id 字段必须是唯一的,因此如果遇到 "MongoError: E11000 duplicate key error collection" 错误,最初的处理方式应该是检查是否有重复的 _id。
在 MongoDB 的 shell 中使用以下命令可以查找重复的 _id:
db.your_collection.aggregate([{$group: {_id: "$_id", count: {$sum: 1}}}, {$match: {count: {$gt: 1}}}], {allowDiskUse: true});
将 your_collection
替换为你的集合名称,如果有重复的 _id,则会返回包含有多个文档的结果。
2. 设置唯一索引
如果你的 MongoDB 集合存在多个唯一字段,那么你需要为每个唯一字段设置唯一索引。
在 Mongoose 中,可以使用 index
方法设置唯一索引。例如,下面的代码将创建一个名为 email
的唯一索引:
const userSchema = new mongoose.Schema({ email: { type: String, unique: true }, name: String, age: Number }); const User = mongoose.model('User', userSchema);
这种方式可以避免出现重复的唯一字段,从而解决 "MongoError: E11000 duplicate key error collection" 错误。
3. 添加 unique 标志
和创建唯一索引类似,还可以在 Mongoose 中使用 unique
标志来确保某个字段是唯一的。例如,下面的代码将为 email
字段添加 unique
标志:
const userSchema = new mongoose.Schema({ email: { type: String, unique: true }, name: String, age: Number }); const User = mongoose.model('User', userSchema);
这种方式不会创建唯一索引,而是会在尝试将文档插入 MongoDB 集合时验证唯一性。如果 email
字段已经存在于集合中,则将阻止插入操作并返回 "MongoError: E11000 duplicate key error collection" 错误。
示例代码
下面是一个包含唯一索引和 unique
标志的 Mongoose 模式示例:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true }); const userSchema = new mongoose.Schema({ email: { type: String, unique: true }, name: String, age: Number }); const User = mongoose.model('User', userSchema); const user1 = new User({ email: 'john@example.com', name: 'John', age: 30 }); const user2 = new User({ email: 'john@example.com', name: 'John', age: 34 }); user1.save((err) => { if (err) console.log(err); // 不会出现错误 }); user2.save((err) => { if (err) console.log(err); // 会出现 "MongoError: E11000 duplicate key error collection" 错误 });
这份代码将在 MongoDB 中创建一个名为 User
的集合,并为 email
字段创建一个唯一索引。它执行了两个插入操作:第一个操作不会出现错误,然而,第二个操作会因为试图添加已经存在的 email
值而出现 "MongoError: E11000 duplicate key error collection" 错误。
总结
"MongoError: E11000 duplicate key error collection" 错误很常见,但是有很多方法可以解决这个问题。使用上述的任何一种解决方案都可以避免重复值的出现,让你的应用程序正常工作。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4e3bbadd4f0e0ffd3e417