我正在用golang和mongodb official driver编写一个小的REST API,我被mongodb的错误验证卡住了。
让我解释一下:
- 我的验证架构(简化)**
var jsonSchema = bson.M{
"bsonType": "object",
"required": []string{"lastname"},
"additionalProperties": false,
"properties": bson.M{
"lastname": bson.M{
"bsonType": "string",
"description": "must be a string and is required",
},
},
}
var validator = bson.M{
"$jsonSchema": jsonSchema,
}
// Migrate create users collection with validation schema
func (r *Repo) Migrate() error {
opts := options.CreateCollection().SetValidator(validator)
if err := r.db.CreateCollection(r.ctx, "users", opts); err != nil {
return err
}
return nil
}
因此,在我的验证模式中,我需要用户的姓氏,并给它一个描述来处理它的错误(我从文档中了解到这一点)
但是使用我的创建用户函数:
// Create user to repo
func (r *Repo) Create(usr *User) {
if r.err != nil {
return
}
u := r.db.Collection("users")
_, err := u.InsertOne(r.ctx, usr)
if err != nil {
we, ok := err.(mongo.WriteException)
if ok {
fmt.Println(we)
for _, r := range we.WriteErrors {
fmt.Println(r)
}
}
r.err = fmt.Errorf("error occured during creating. got=%w", err)
return
}
}
我的用户结构
// User structure representation
type User struct {
ID primitive.ObjectID `bson:"_id"`
Lastname string `bson:"lastname"`
}
来自post http请求的我的json主体
{
"something": "xxxx"
}
预期错误:类似于(例如,我预期的错误):
{
"field": "lastname",
"message": "must be a string and is required"
}
我从我的错误中得到:multiple write errors: [{write errors: [{Document failed validation}]}, {<nil>}]
从我对WriteException的错误强制转换中:Document failed validation
我读了文档description N/A string A string that describes the schema and has no effect.
,但对验证没有影响,或者它只是对读架构的人的注解?
我想有我的描述我的错误显示到我的http resp!也许我是在错误的方式来管理它,所以我可以重写它!
感谢阅读我,希望有人能帮助我:)祝你有美好的一天
3条答案
按热度按时间bjp0bcyl1#
目前(MongoDB v4.4)MongoDB服务器没有返回文档验证失败的原因。有一个未决问题SERVER-20547来跟踪此工作。请随时观看或投票票来接收进度更新。
您应该实现应用程序级输入验证。确保在插入数据库之前输入的数据类型正确。
8nuwlpux2#
您需要在属性中声明id字段,因为
additionalProperties
属性被设置为false。Mongodb自动将**_id字段注入到将要插入到集合中的文档中,以提高数据处理性能。下面是添加到_id**属性的方案示例:
zbwhf8kr3#
您可以使用此工具从golang结构https://github.com/s-augustovitko/mongo-schema-go创建模式