Mongoose E11000重复密钥,用户名字段不唯一

nfeuvbwi  于 2023-08-06  发布在  Go
关注(0)|答案(2)|浏览(114)

我有这个问题。我做了一个登录系统,它是这样工作的:
1.使用Discord登录
1.如果存在-如果用户更改了其Discord信息,则更新并返回用户信息。如果他们没有更改任何Discord帐户信息,只需返回用户信息
1.如果不存在-创建用户并返回用户信息
这是我的user.js模式:

import mongoose from 'mongoose';

const Schema = mongoose.Schema
const userSchema = new Schema({
  userId: {type: String, required: true, unique: true},
  username: {type: String, required: true, unique: false},
  type: {type: String, required: true},
  discrim: {type: String, required: true},
  email: {type: String, required: true},
  avatar: {type: String, required: true},
  banned: {type: Boolean, required: true}
})

const User = mongoose.model('User', userSchema)
export default User

字符串
还有登录系统登录(只是一个原型来显示问题):

app.post("/login-test", (req, res) => {
  User.findOne({"userId": req.body.uid}).then((result) => {
    console.log(result)
    if(result == null){
      const newUser = new User({
        userId: req.body.uid,
        username: "sharek1234",
        discrim: "1236",
        email: "sharekxass@gmail.com",
        avatar: "bereknone",
        banned: false,
        type: "user"
      })
      newUser.save().then((resp) => {
        res.json(resp)
      })
    }else{
      User.updateOne({"userId": req.body.uid}, {
        discrim: "1236",
        email: "sharekxass@gmail.com",
        avatar: "bereknone",
        banned: false,
        type: "user"
      }).then((resp) => {
        res.json(resp)
      }).catch((pog) => {
        console.log(pog)
        res.json(pog)
      })
    }
  })
})


但是当我尝试在Discord帐户信息更改后使用现有用户登录时,其中名称为“MyName 123”的其他用户已经存在,例如:
变更前:

UserID: "12345"
Username: "MyName"
Discrim: "1000"


变更后:

UserID: "12345"
Username: "MyName123"
Discrim: "9999"


返回E11000错误。E11000 duplicate key error collection: ShardDB.users index: username_1 dup key: { username: "MyName123" }。请注意,userSchema中的username字段不是唯一的。
我不知道该怎么补救。

fcipmucu

fcipmucu1#

我解决了这个问题,我不知道为什么,但在我的数据库中有“username_1”索引,它被设置为唯一的。我删除了它,现在一切正常。

guz6ccqo

guz6ccqo2#

我知道这是固定的,但如果其他人有这个问题,这是因为该列是唯一的,然后被更改,因此索引已经创建。
就像OP提到的,删除索引可以解决这个问题。

相关问题