Heim > Backend-Entwicklung > Golang > Überprüfen Sie, ob der Wert im Objektarray vorhanden ist

Überprüfen Sie, ob der Wert im Objektarray vorhanden ist

WBOY
Freigeben: 2024-02-10 13:30:21
nach vorne
1121 Leute haben es durchsucht

检查对象数组中的值是否存在 golang

In diesem Artikel stellt Ihnen der PHP-Editor Baicao vor, wie Sie überprüfen, ob der Wert im Objektarray in Golang vorhanden ist. Während des Entwicklungsprozesses müssen wir häufig Arrays bedienen und beurteilen, und in einigen Fällen müssen wir überprüfen, ob ein bestimmter Wert in einem Objektarray vorhanden ist. Dieser Prozess kann das Durchlaufen von Arrays, den Vergleich von Werten usw. umfassen. Im Folgenden stellen wir Ihnen Schritt für Schritt vor, wie Sie diese Funktion implementieren.

Frageninhalt

Ich versuche zu prüfen, ob ein neuer Wert vorhanden ist, bevor ich ihn an eine Mongo-Datenbank anhänge, erhalte jedoch jedes Mal eine Fehlermeldung.

obid, _ := primitive.objectidfromhex(id)
        query := bson.d{{key: "_id", value: obid}}
    
        var result bson.m
        er := r.collection.findone(ctx, bson.m{"_id": obid, "statusdata.status": bson.m{"$in": []string{string(p.status)}}}).decode(&result)
        if er != nil {
            if er == mongo.errnodocuments {
                return nil, errors.new(fmt.sprintf("err na  %v, %v", er.error(), p.status))
            }
            return nil, errors.new(fmt.sprintf("err norr  %v", er.error()))
        }

doc, err := utils.todoc(p)
    if err != nil {
        return nil, errors.new(err.error())
    }

    update := bson.d{{key: "$set", value: doc}}
    res := r.collection.findoneandupdate(ctx, query, update, options.findoneandupdate().setreturndocument(1))
Nach dem Login kopieren

Mein Dokument sieht so aus

{
  "statusdata": [
                {
                    "status": "new",
                    "message": "you created a new dispatch request",
                    "createdat": "1657337212751",
                    "updatedat": null
                },
                {
                    "status": "assigned",
                    "message": "justin has been assigned to you",
                    "createdat": "1657412029130",
                    "updatedat": null,
                    "_id": "62ca19bdf7d864001cabfa4a"
                }
            ],
            "createdat": "2022-07-10t00:09:01.785z",
Nach dem Login kopieren

.... }

Es gibt verschiedene Zustände und ich möchte sicherstellen, dass derselbe Zustand nicht mehrmals an die Datenbank gesendet wird, bevor ich ihn mit den neuen Werten aktualisiere.

type statustype string

const (
    new              statustype = "new"
    acknowledged     statustype = "acknowledged"
    assigned         statustype = "assigned"
    reject           statustype = "rejected"
    cancel           statustype = "cancelled"
    complete         statustype = "completed"
)
Nach dem Login kopieren

utils.todoc

func todoc(v interface{}) (doc *bson.d, err error) {
    data, err := bson.marshal(v)
    if err != nil {
        return
    }

    err = bson.unmarshal(data, &doc)
    return
}
Nach dem Login kopieren

Versuchen Sie, ein Update durchzuführen

filter := bson.m{
        "_id":               obid,
        "statusdata.status": bson.m{"$ne": p.status},
    }
    update := bson.m{
        "$push": bson.m{
            "statusdata": newstatustoadd,
        },
        "$set": bson.d{{key: "$set", value: doc}},
    }

    result, err := r.collection.updateone(ctx, filter, update)
    if err != nil {
        // handle error
        return nil, errors.new(err.error())
    }
    if result.matchedcount == 0 {
        // the status already exists in statusdata
    } else if result.modifiedcount == 1 {
        // new status was added successfuly
    }
Nach dem Login kopieren

Rückgabefehler

"write exception: write errors: [The dollar ($) prefixed field '$set'
in '$set' is not allowed in the context of an update's replacement
document. Consider using an aggregation pipeline with $replaceWith.]"
Nach dem Login kopieren

Workaround

Verwenden Sie einen Filter, um Dokumente mit dem Status auszuschließen, den Sie hinzufügen möchten. Wenn der Status bereits im Array vorhanden ist, stimmt dieser Filter mit keinem Dokument überein. Der Aktualisierungsvorgang wird nur durchgeführt, wenn der Status noch nicht hinzugefügt wurde:

var newStatusToAdd = ... // This is the new statusData document you want to add

filter := bson.M{
    "_id": obId,
    "statusData.status": bson.M{"$ne": p.Status},
}
update := bson.M{
    "$push": bson.M{
        "statusData": newStatusToAdd,
    },
    "$set": doc,
}

result, err := r.collection.UpdateOne(ctx, filter, update)
if err != nil {
    // Handle error
    return
}
if result.MatchedCount == 0 {
    // The status already exists in statusData
} else if result.ModifiedCount == 1 {
    // new status was added successfuly
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonÜberprüfen Sie, ob der Wert im Objektarray vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage