用mongo'd db.decode(&dto)Map嵌套结构

eh57zj3b  于 2023-06-27  发布在  Go
关注(0)|答案(1)|浏览(93)

bounty将在5天内到期。此问题的答案有资格获得+50声望奖励。Mike3355正在寻找一个规范答案

我有一个模型,它创建了一个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"
}

从我读到的。解码也应该Map嵌套值吗?

0ve6wy6x

0ve6wy6x1#

JSON?但是the Go MongoDB driver works with BSON
struct标签用于定义Go结构体字段应该如何Map到MongoDB文档字段。
Course结构体中,您使用的是json标记,但Go中MongoDB驱动程序中的Decode方法使用bson标记将文档字段Map到结构体字段。
要解决这个问题,您应该将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"`
}

请注意,您可以在同一字段中同时使用bsonjson标记。bson标签在与MongoDB交互时使用(例如,在调用.Decode()时),而json标签在将JSON格式编组/解编组时使用。
此外,确保bson标记中的字段名称与MongoDB文档中的字段名称匹配。例如,如果MongoDB文档中的字段名为courseDetails而不是course_details,则应将bson标记更改为bson:"courseDetails"

相关问题