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

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

WBOY
WBOYnach vorne
2024-02-10 13:30:211078Durchsuche

检查对象数组中的值是否存在 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))

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",

.... }

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"
)

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
}

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
    }

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.]"

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
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Golang Docker Selenium ChromeNächster Artikel:Golang Docker Selenium Chrome