Maison >développement back-end >Golang >Utilisez mongo'd db .Decode(&dto) pour cartographier les structures imbriquées

Utilisez mongo'd db .Decode(&dto) pour cartographier les structures imbriquées

PHPz
PHPzavant
2024-02-09 11:51:081095parcourir

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

L'éditeur PHP Zimo vous présente aujourd'hui une méthode de mappage de structures imbriquées à l'aide de mongo'd db .Decode(&dto). Au cours du processus de développement, nous rencontrons souvent des situations dans lesquelles nous devons décoder et mapper des structures imbriquées de la base de données vers les objets de transfert de données (DTO) correspondants. La fonction Decode de mongo'db peut nous aider à simplifier ce processus. Il suffit de transmettre la structure à décoder et l'objet DTO cible, et le décodage et le mappage peuvent être automatiquement effectués. Cette méthode est simple et efficace et peut grandement améliorer l’efficacité du développement. Ensuite, nous présenterons en détail comment utiliser cette méthode pour implémenter le mappage de structures imbriquées.

Contenu de la question

J'ai un modèle qui crée des documents json sans problème, mais sa récupération entraîne le fait que l'objet json imbriqué est vide.

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"`
}

Résultats

{
    "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"
}

D'après ce que j'ai lu, devrait-il également décoder les valeurs imbriquées de la carte ?

Solution

json ? Mais le pilote go mongodb fonctionne avec bson

La balise Structure est utilisée pour définir comment les champs de structure doivent être mappés aux champs du document MongoDB.
Dans la structure course, vous utilisez la balise json, mais le decode du programme course 结构中,您使用 json 标签,但是 decode 方法使用 bson utilise la balise

pour mapper les champs du document aux champs de structure.

bsonPour résoudre ce problème, vous devez ajouter la balise

à vos champs de structure (y compris les structures imbriquées) pour indiquer au pilote mongodb comment décoder le document dans votre structure.

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() 时),而 jsonNotez que vous pouvez avoir à la fois les balises

et json sur le même champ. La balise

est utilisée lors de l'interaction avec mongodb (par exemple, lors de l'appel de .decode()), tandis que la balise json est utilisée lors du marshalling/unmarshaling au format json. bson 标记中的字段名称与 mongodb 文档中的字段名称匹配。例如,如果 mongodb 文档中的字段名为 coursedetails 而不是 course_details,则应将 bson 标记更改为 bson:"coursedetails"

Assurez-vous également que les noms de champs dans la balise 🎜 correspondent aux noms de champs dans le document mongodb. Par exemple, si un champ dans un document mongodb est nommé coursedetails au lieu de course_details, la balise 🎜 doit être remplacée par bson:"coursedetails" . 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer