gpt4 book ai didi

mongodb - 如何处理重复的唯一索引错误?

转载 作者:行者123 更新时间:2023-12-01 22:16:44 35 4
gpt4 key购买 nike

我正在使用MongoDB。将数据添加到集合的代码:

  type User struct {
Firstname string `json:"firstname" bson:"firstname"`
Lastname *string `json:"lastname,omitempty" bson:"lastname"`
Username string `json:"username" bson:"username"`
RegistrationDate primitive.DateTime `json:"registrationDate" bson:"registrationData"`
LastLogin primitive.DateTime `json:"lastLogin" bson:"lastLogin"`
}


var client *mongo.Client

func AddUser(response http.ResponseWriter, request *http.Request) {
collection := client.Database("hattip").Collection("user")
var user User
_ = json.NewDecoder(request.Body).Decode(&user)
insertResult, err := collection.InsertOne(context.TODO(), user)
if err != nil {
// here i need to get the kind of error.
fmt.Println("Error on inserting new user", err)
response.WriteHeader(http.StatusPreconditionFailed)
} else {
fmt.Println(insertResult.InsertedID)
response.WriteHeader(http.StatusCreated)
}

}

func main() {
client = GetClient()
err := client.Ping(context.Background(), readpref.Primary())
if err != nil {
log.Fatal("Couldn't connect to the database", err)
} else {
log.Println("Connected!")
}

router := mux.NewRouter()
router.HandleFunc("/person", AddUser).Methods("POST")
err = http.ListenAndServe("127.0.0.1:8080", router)
if err == nil {
fmt.Println("Server is listening...")
} else {
fmt.Println(err.Error())
}

}

func GetClient() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
client, err := mongo.NewClient(clientOptions)

if err != nil {
log.Fatal(err)
}
err = client.Connect(context.Background())
if err != nil {
log.Fatal(err)
}
return client
}

如果添加具有数据库中已经存在的用户名的记录,则会得到-

插入新用户时出错,出现多个写入错误:[{写入错误:
[{E11000重复键错误集合:hattip.user索引:
username_unique dup键:{username:“dd”}}]},{}]

fmt.Println("Error on inserting new user", err)行中已经存在带有 dd字段中的字符串 username的记录,并且 username字段是唯一索引。

我想确保该错误是确切的E11000错误(重复收集的关键错误)。

到目前为止,我将 err与在重复唯一字段时出现的整个错误字符串进行了比较,但这是完全错误的。如果有一种方法可以从 err对象获取错误代码,或者有其他方法可以解决此问题?

另外,我找到了 mgo包,但是要正确使用它,我必须学习它,重写当前代码等等,但是说实话,它看起来不错:
if mgo.IsDup(err) {
err = errors.New("Duplicate name exists")
}

最佳答案

根据驱动程序文档,InsertOne可能返回WriteException,因此您可以检查错误是否是WriteException,如果是,则检查其中的WriteErrors。每个WriteError都包含一个错误代码。

if we, ok:=err.(WriteException); ok {
for _,e:=range we.WriteErrors {
// check e.Code
}
}

您可以基于此编写 IsDup

关于mongodb - 如何处理重复的唯一索引错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59491670/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com