猫鼬 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。例如。如果您使用useridAAA”创建一个新的routineParts 文档,您不能创建另一个具有相同useridAAA”的文档。简而言之,这意味着每个用户只能创建 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的主要内容,如果未能解决你的问题,请参考以下文章

MongoError,err:E11000 重复键错误

猫鼬 |如何从此猫鼬模式中删除重复错误[重复]

我该如何修复(节点: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