Задать вопрос
Glitchmorphosis
@Glitchmorphosis

Как обработать ошибку дублирования уникального индекса (duplicate key error collection)?

Использую 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 {
                // здесь нужно понять какая именно ошибка.
		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
}

Если я добавляю запись, с полем username, данные которого уже есть в БД то получаю -
Error on inserting new user multiple write errors: [{write errors: [{E11000 duplicate key error collection: hattip.user index: username_unique dup key: { username: "dd" }}]}, {}]
в строке fmt.Println("Error on inserting new user", err). Запись со строкой dd в поле username уже есть, а поле username является уникальным индексом.

Мне нужно как-то понять, что ошибка именно E11000 (duplicate key error collection).
Пока придумал сравнивать err со всей строкой ошибки, которая возникает при дубликате уникального поля, но это же совсем не правильно. Может можно как-то получить доступ к коду ошибки из объекта err, или может быть есть еще какие то способы?

Еще нашел вариант проверки с помощью пакета mgo, но чтобы его использовать придется изучать новый пакет, переписывать подключение и так далее, но зато выглядит хорошо:
if mgo.IsDup(err) {
                err = errors.New("Duplicate name exists for the shorturl")
            }
  • Вопрос задан
  • 757 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@RidgeA
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы