猿问

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

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

}


饮歌长啸
浏览 101回答 1
1回答

互换的青春

如果我添加数据库中已存在的用户名的记录,我会得到 -插入新用户时出错多个写入错误:[{写入错误:[{E11000重复键错误集合:hattip.user索引:username_unique dup key:{username:“dd”}}]},{}]行中字段中带有fmt.Println("Error on inserting new user", err)字符串的记录已经存在,并且该字段是唯一索引。ddusernameusername我想确保该错误是确切的 E11000 错误(关键错误的重复集合)。到目前为止,我err与唯一字段重复时出现的整个错误字符串进行了比较,但它是完全错误的。是否有办法从err对象获取错误代码,或者有其他方法来解决这个问题?另外,我找到了mgo包,但为了正确使用它,我必须学习它,重写当前代码等等,但老实说,它看起来不错:if mgo.IsDup(err) {    err = errors.New("Duplicate name exists")}
随时随地看视频慕课网APP

相关分类

Go
我要回答