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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理重复的唯一索引错误?相关的知识,希望对你有一定的参考价值。

我正在使用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

以上是关于如何处理重复的唯一索引错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 ArgumentOutOfRangeException [重复]

如何处理相同的哈希与相同的密钥?

如何处理此索引超出范围错误 (LINGO)

如何处理错误:ER_DUP_ENTRY:nodejs 中的重复条目

如何处理 SQLAlchemy、flask、python 中的唯一数据

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引