猫鼬 MongoError : 11000
Posted
技术标签:
【中文标题】猫鼬 MongoError : 11000【英文标题】:Mongoose MongoError : 11000 【发布时间】:2021-09-11 09:18:55 【问题描述】:我通过 Postman 发送了一个 create post 信号。一次,post 信号是成功的。但下次它失败了。错误信息是这样的。
Error creating new record :
"driver": true,
"name": "MongoError",
"index": 0,
"code": 11000,
"keyPattern":
"RoutineParts.userId": 1
,
"keyValue":
"RoutineParts.userId": null
我无法理解错误信息, 我的post code和user model code是这样的,
// it's post code.
router.post('/',(req,res)=>
const newRecord = User (
username : req.body.username,
email : req.body.email,
password : req.body.password
)
newRecord.save((err,docs)=>
if(!err)
res.send(docs)
else
console.log('Error creating new record : ' + JSON.stringify(err,undefined,2))
)
)
// it's user model
const mongoose = require('mongoose')
const userSchema = new mongoose.Schema(
username : type:String,
email: type: String, required: true,
password: type: String, required: true, trim: true ,
created_at : type: Date, default: Date.now ,
updated_at : type: Date, default: Date.now ,
)
const User = mongoose.model('User', userSchema);
module.exports = User
我不明白。事实上,'RoutineParts' 是一个模型,但我没有编写用户文档。并且,在 app.js 中更正了控制器路径
我该如何解决?
这是 RoutineParts 模型
const mongoose = require('mongoose')
const userSchema = new mongoose.Schema(
routine_name : type:String,
userId : type: String, required: true,
exercise_name : type: String,
order : type: Number,
)
const RoutineParts = mongoose.model('RoutineParts', userSchema);
module.exports = RoutineParts
它是 app.js 的内容
// Connecting data to the MongoDB through Mongoose
require('./db')
const express = require('express')
const app = express()
const PORT = 5000
const bodyParser = require('body-parser')
const userRoute = require('./controller/user')
const routineRoute = require('./controller/routine')
const RP_Route = require('./controller/routineParts')
const EX_Route = require('./controller/excersise')
app.use(bodyParser.json())
app.get("/", function (req, res)
res.status(201).send("<h1>Hey guys! Hello World !!</h1>");
);
app.listen(PORT, function ()
console.log(`start express server on port $PORT`);
);
app.use('/Users', userRoute)
app.use('/Routine', routineRoute)
app.use('/Excersise', EX_Route)
app.use('/RoutineParts', RP_Route)
【问题讨论】:
另外,不确定错误代码是关于什么的。 11000 用于重复文档,但我在文档中找不到。 @Loolii 看起来错误是关于另一个模型RoutinePart
。您能否包含更多代码 - 错误似乎不是来自您共享的代码。
为什么在 RoutineParts Schema 中需要 unique
true
for userid
?尝试将其删除以进行测试并重新开始。
一定有你没有告诉我们/展示给我们的东西。您的文件结构如何? MongoDB 中是否已经有任何文档?我认为 MongoDB 现在已经索引了 userid 字段……尝试从 mongodb 中删除集合并重新开始。显然,在某些时候,您正在尝试创建一个仅第一次工作的 RoutinePart
,之后它会向您显示 Duplicate Key 错误。
是的,但是您连接到 mongodb 数据库对吗?否则你会把你的数据存储在哪里? mongoose
只是一个与 mongodb 交互的 nodejs 驱动程序。
【参考方案1】:
发生了什么
我查看了您的完整代码。唯一真正的问题,也与您看到的错误消息相符,如下:
在您的./models/routineParts.js
中,您设置了一个unique
字段。在你的情况下userid
。例如。如果您使用userid
“AAA
”创建一个新的routineParts
文档,您不能创建另一个具有相同userid
“AAA
”的文档。简而言之,这意味着每个用户只能创建 1 个 routineParts
文档。
当您第一次向您的路线 localhost:5000/RoutineParts
发出 POST
请求时,它创建了第一个 routineParts
文档。之后,每个请求都会失败,因为它已经创建了 1 个routineParts
文档。 (在此处阅读有关 unique index with mongoose 的信息)
请参阅您的 ./controller/routineParts.js
。如果您尝试使用不同的userid
执行相同的请求,它应该可以工作。
如何解决
1 :从您的 ./models/routineParts
架构中删除 unique: true
。
2:⚡删除索引。 Mongoose most-likey 已经注册了这个索引,你必须专门删除它。否则它将始终将userid
字段视为unique
。
3 :您仍处于开发阶段,因此删除 RoutineParts
集合也不会有什么坏处。
4 :重新启动应用程序并尝试多次访问POST localhost:5000/RoutineParts
端点。您现在应该能够在同一用户下创建多个 routineParts
文档。
如何删除索引
那是另一回事。 This question 应该可以帮助您。他们也在使用猫鼬。如果您使用的是最新版本的mongoose
,则有一个名为cleanIndexes
的方法。从模型中删除 unique:true
后使用此方法。
【讨论】:
以上是关于猫鼬 MongoError : 11000的主要内容,如果未能解决你的问题,请参考以下文章
我该如何修复(节点:14352)UnhandledPromiseRejectionWarning:MongoError:E11000 重复键错误集合:错误?
MongoError:E11000 重复键错误集合:annka.transactions 索引:assets_1 重复键::null
MongoError:E11000 重复键错误集合:myFirstDatabase.tours 索引:rating_1 重复键: rating:null
MongoError:E11000 重复键错误集合:workflow.compnies 索引:username_1 dup key: username:null