我有这个问题。我做了一个这样的登录系统:
- Login with Discord
- 如果存在-如果用户更改了他们的不和信息,更新并返回用户信息。如果他们没有更改任何Discord帐户信息,只需返回用户信息
- 如果不存在-创建用户并返回用户信息
这是我的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
还有一个login system login(只是一个展示问题的原型):
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帐户信息更改后与现有用户登录时,其他用户的名称为"myname123";
更改前:
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
字段不是唯一的
我不知道如何解决这个问题。
我解决了这个问题,我不知道为什么,但是有&;username_1&;索引,它被设置为唯一。我把它删了,现在一切都好了。
我知道这是固定的,但如果其他人有这个问题,这是因为该列是唯一的,然后被更改,因此索引已经创建。
就像OP提到的,删除索引可以解决这个问题。