英文:
Mapping a nested struct with mongo'd db .Decode(&dto)
问题
我有一个创建 JSON 文档的模型,没有问题,但是检索它时,嵌套的 JSON 对象为空。
func (r *CourseRepo) GetCourseById(ctx context.Context, id string) (Course, error) {
clog := log.GetLoggerFromContext(ctx)
var course Course
objID, err := primitive.ObjectIDFromHex(id)
if err != nil {
return course, err
}
filter := bson.M{"_id": objID}
err = r.collection.FindOne(ctx, filter).Decode(&course)
if err != nil {
clog.ErrorCtx(err, log.Ctx{"msg": "an error occurred while finding a course"})
return course, err
}
return course, nil
}
结构体:
type Course struct {
ObjectId primitive.ObjectID `bson:"_id,omitempty"`
Id string `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
Lessons string `json:"lessons"`
Duration string `json:"duration"`
Details struct {
Title string `json:"title"`
Instructor string `json:"instructor"`
Introduction string `json:"introduction"`
Learn string `json:"learn"`
Topics string `json:"topics"`
Prerequisites string `json:"prerequisites"`
Goal string `json:"goal"`
AdditionalDetails string `json:"additionalDetails"`
HighLevelOverview string `json:"highLevelOverview"`
} `json:"course_details"`
}
结果:
{
"data": {
"ObjectId": "64953ac1bf06bfdd7936cad8",
"id": "",
"title": "Java Algorithms",
"description": "An awesome course",
"lessons": "4",
"duration": "10 hours",
"course_details": {
"title": "",
"instructor": "",
"introduction": "",
"learn": "",
"topics": "",
"prerequisites": "",
"goal": "",
"additionalDetails": "",
"highLevelOverview": ""
}
},
"metadata": "none"
}
根据我所了解的,.Decode
应该能够映射嵌套的值,对吗?
英文:
I have a model that creates a JSON document with no issue but retrieving it results in the nested JSON object being empty.
func (r *CourseRepo) GetCourseById(ctx context.Context, id string) (Course, error) {
clog := log.GetLoggerFromContext(ctx)
var course Course
objID, err := primitive.ObjectIDFromHex(id)
if err != nil {
return course, err
}
filter := bson.M{"_id": objID}
err = r.collection.FindOne(ctx, filter).Decode(&course)
if err != nil {
clog.ErrorCtx(err, log.Ctx{"msg": "an error occurred while finding a course"})
return course, err
}
return course, nil
}
Struct
type Course struct {
ObjectId primitive.ObjectID `bson:"_id, omitempty"`
Id string `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
Lessons string `json:"lessons"`
Duration string `json:"duration"`
Details struct {
Title string `json:"title"`
Instructor string `json:"instructor"`
Introduction string `json:"introduction"`
Learn string `json:"learn"`
Topics string `json:"topics"`
Prerequisites string `json:"prerequisites"`
Goal string `json:"goal"`
AdditionalDetails string `json:"additionalDetails"`
HighLevelOverview string `json:"highLevelOverview"`
} `json:"course_details"`
}
result
{
"data": {
"ObjectId": "64953ac1bf06bfdd7936cad8",
"id": "",
"title": "Java Algorithms",
"description": "An awesome course",
"lessons": "4",
"duration": "10 hours",
"course_details": {
"title": "",
"instructor": "",
"introduction": "",
"learn": "",
"topics": "",
"prerequisites": "",
"goal": "",
"additionalDetails": "",
"highLevelOverview": ""
}
},
"metadata": "none"
}
From what I read .Decode should map the nest values too?
答案1
得分: 2
JSON?但是Go MongoDB驱动程序与BSON一起工作
结构标签用于定义Go结构字段应如何映射到MongoDB文档字段。
在您的Course
结构中,您使用了json
标签,但是Go中的MongoDB驱动程序的Decode
方法使用bson
标签将文档字段映射到结构字段。
为了解决这个问题,您应该在结构字段中添加bson
标签,包括嵌套结构,以指示MongoDB驱动程序如何将文档解码为您的结构。
type Course struct {
ObjectId primitive.ObjectID `bson:"_id,omitempty" json:"ObjectId"`
Id string `bson:"id" json:"id"`
Title string `bson:"title" json:"title"`
Description string `bson:"description" json:"description"`
Lessons string `bson:"lessons" json:"lessons"`
Duration string `bson:"duration" json:"duration"`
Details struct {
Title string `bson:"title" json:"title"`
Instructor string `bson:"instructor" json:"instructor"`
Introduction string `bson:"introduction" json:"introduction"`
Learn string `bson:"learn" json:"learn"`
Topics string `bson:"topics" json:"topics"`
Prerequisites string `bson:"prerequisites" json:"prerequisites"`
Goal string `bson:"goal" json:"goal"`
AdditionalDetails string `bson:"additionalDetails" json:"additionalDetails"`
HighLevelOverview string `bson:"highLevelOverview" json:"highLevelOverview"`
} `bson:"course_details" json:"course_details"`
}
请注意,您可以在同一个字段上同时使用bson
和json
标签。bson
标签在与MongoDB交互时使用(例如,调用.Decode()
时),而json
标签在JSON格式的编组/解组时使用。
此外,请确保bson
标签中的字段名称与MongoDB文档中的字段名称匹配。例如,如果MongoDB文档中的字段名为courseDetails
而不是course_details
,则应将bson
标签更改为bson:"courseDetails"
。
英文:
JSON? But the Go MongoDB driver works with BSON
The struct tags are used to define how the Go struct fields should be mapped to the MongoDB document fields.
In your Course
struct, you are using json
tags, but the Decode
method from the MongoDB driver in Go uses the bson
tags to map the document fields to the struct fields.
To solve this issue, you should add bson
tags to your struct fields, including the nested struct, to instruct the MongoDB driver how to decode the document into your struct.
type Course struct {
ObjectId primitive.ObjectID `bson:"_id,omitempty" json:"ObjectId"`
Id string `bson:"id" json:"id"`
Title string `bson:"title" json:"title"`
Description string `bson:"description" json:"description"`
Lessons string `bson:"lessons" json:"lessons"`
Duration string `bson:"duration" json:"duration"`
Details struct {
Title string `bson:"title" json:"title"`
Instructor string `bson:"instructor" json:"instructor"`
Introduction string `bson:"introduction" json:"introduction"`
Learn string `bson:"learn" json:"learn"`
Topics string `bson:"topics" json:"topics"`
Prerequisites string `bson:"prerequisites" json:"prerequisites"`
Goal string `bson:"goal" json:"goal"`
AdditionalDetails string `bson:"additionalDetails" json:"additionalDetails"`
HighLevelOverview string `bson:"highLevelOverview" json:"highLevelOverview"`
} `bson:"course_details" json:"course_details"`
}
Note that you can have both bson
and json
tags on the same field. The bson
tags are used when interacting with MongoDB (e.g., when calling .Decode()
), and the json
tags are used when marshaling/unmarshaling to/from JSON format.
Also, make sure that the field names in your bson
tags match the field names in your MongoDB documents. For example, if the field in the MongoDB document is named courseDetails
instead of course_details
, you should change the bson
tag to bson:"courseDetails"
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论