Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie mongo'd db .Decode(&dto), um verschachtelte Strukturen abzubilden

Verwenden Sie mongo'd db .Decode(&dto), um verschachtelte Strukturen abzubilden

PHPz
PHPznach vorne
2024-02-09 11:51:081079Durchsuche

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

Der PHP-Editor Zimo stellt Ihnen heute eine Methode zum Zuordnen verschachtelter Strukturen mithilfe von mongo'd db .Decode(&dto) vor. Während des Entwicklungsprozesses stoßen wir häufig auf Situationen, in denen wir verschachtelte Strukturen aus der Datenbank dekodieren und in die entsprechenden Datentransferobjekte (DTO) abbilden müssen. Die Dekodierfunktion von mongo'db kann uns helfen, diesen Prozess zu vereinfachen. Wir müssen nur die zu dekodierende Struktur und das Ziel-DTO-Objekt übergeben, und die Dekodierung und Zuordnung kann automatisch durchgeführt werden. Diese Methode ist einfach und effizient und kann die Entwicklungseffizienz erheblich verbessern. Als Nächstes stellen wir detailliert vor, wie diese Methode zum Implementieren der Zuordnung verschachtelter Strukturen verwendet wird.

Frageninhalt

Ich habe ein Modell, das JSON-Dokumente ohne Probleme erstellt, aber das Abrufen führt dazu, dass das verschachtelte JSON-Objekt leer ist.

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
}

Struktur

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

Ergebnisse

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

Sollten nach dem, was ich gelesen habe, auch verschachtelte Kartenwerte dekodiert werden?

Lösung

json? Aber der go mongodb-Treiber funktioniert mit bson

Structure-Tag wird verwendet, um zu definieren, wie Go-Strukturfelder Mongodb-Dokumentfeldern zugeordnet werden sollen.
In der Struktur course verwenden Sie das Tag json, aber den Treiber decode-Methode course 结构中,您使用 json 标签,但是 decode 方法使用 bson des Programms verwendet das

-Tag, um Dokumentfelder Strukturfeldern zuzuordnen.

bsonUm dieses Problem zu beheben, sollten Sie den Tag

zu Ihren Strukturfeldern (einschließlich verschachtelter Strukturen) hinzufügen, um den Mongodb-Treiber anzuweisen, wie er das Dokument in Ihre Struktur dekodieren soll.

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() 时),而 jsonBeachten Sie, dass Sie sowohl

- als auch json-Tags im selben Feld haben können. Das Tag

wird bei der Interaktion mit Mongodb verwendet (z. B. beim Aufruf von .decode()), während das Tag json beim Marshalling/Unmarshaling in das JSON-Format verwendet wird. bson 标记中的字段名称与 mongodb 文档中的字段名称匹配。例如,如果 mongodb 文档中的字段名为 coursedetails 而不是 course_details,则应将 bson 标记更改为 bson:"coursedetails"

Stellen Sie außerdem sicher, dass die Feldnamen im 🎜-Tag mit den Feldnamen im Mongodb-Dokument übereinstimmen. Wenn beispielsweise ein Feld in einem MongoDB-Dokument coursedetails statt course_details heißt, sollte das 🎜-Tag in bson:"coursedetails" geändert werden . 🎜

Das obige ist der detaillierte Inhalt vonVerwenden Sie mongo'd db .Decode(&dto), um verschachtelte Strukturen abzubilden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen