Home  >  Article  >  Backend Development  >  Use mongo'd db .Decode(&dto) to map nested structures

Use mongo'd db .Decode(&dto) to map nested structures

PHPz
PHPzforward
2024-02-09 11:51:081079browse

使用 mongo\'d db .Decode(&dto) 映射嵌套结构

php editor Zimo today introduces a method of using mongo'd db .Decode(&dto) to map nested structures. During the development process, we often encounter situations where we need to decode and map nested structures from the database into the corresponding data transfer objects (DTO). The Decode function of mongo'db can help us simplify this process. We only need to pass in the structure to be decoded and the target DTO object, and the decoding and mapping can be automatically performed. This method is simple and efficient, and can greatly improve development efficiency. Next, we will introduce in detail how to use this method to implement the mapping of nested structures.

Question content

I have a model that creates a json document without 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
}

Structure

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've read, should decode map nested values ​​as well?

Solution

json? But go mongodb driver works with bson

The structure tag is used to define how go structure fields should be mapped to mongodb document fields.
In the course structure you use the json tag, but the decode method maps the document fields using the bson tag to the structure field.

To resolve this issue, you should add the bson tag to your struct fields (including nested structs) 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 tag is used when interacting with mongodb (for example, when calling .decode()), while the json tag is used when marshalling/unmarshaling to json format use.

Additionally, make sure that the field names in the bson tag match the field names in the mongodb document. For example, if the field in the mongodb document is named coursedetails instead of course_details, then the bson tag should be changed to bson:"coursedetails".

The above is the detailed content of Use mongo'd db .Decode(&dto) to map nested structures. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete