我正在使用MongoDB. Code向集合中添加数据:
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 index:username_unique dup key:{ username:“dd”}}]},{}]
in the line fmt.Println("Error on inserting new user", err)
在username
字段中包含字符串dd
的记录已经存在,并且username
字段是唯一索引。
我想确保错误是确切的E11000错误(一个重复的关键错误集合)。
到目前为止,我将err
与重复唯一字段时出现的整个错误字符串进行了比较,但这是完全错误的。如果有一种方法可以从err
对象中获取错误代码,或者有其他方法可以解决这个问题?
另外,我发现了mgo
包,但要正确使用它,我必须学习它,重写当前代码等,但老实说,它看起来不错:
if mgo.IsDup(err) {
err = errors.New("Duplicate name exists")
}
型
2条答案
按热度按时间beq87vna1#
根据驱动文档,
InsertOne
可能会返回一个WriteException
,所以你可以检查错误是否是一个WriteException
,如果是的话,检查其中的WriteErrors
。每个WriteError
都包含一个错误代码。字符串
你可以在此基础上写一个
IsDup
。bq3bfh9z2#
最直接的选择是在这里使用
mongo.IsDuplicateKey(error)
函数。