Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Semak sama ada nilai dalam tatasusunan objek wujud golang

Semak sama ada nilai dalam tatasusunan objek wujud golang

WBOY
WBOYke hadapan
2024-02-10 13:30:211078semak imbas

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

Dalam artikel ini, editor PHP Baicao akan memperkenalkan anda cara menyemak sama ada nilai dalam tatasusunan objek wujud dalam golang. Semasa proses pembangunan, kita selalunya perlu mengendalikan dan menilai tatasusunan, dan dalam beberapa kes, kita perlu menyemak sama ada nilai tertentu wujud dalam tatasusunan objek. Proses ini mungkin melibatkan merentasi tatasusunan, membandingkan nilai, dll. Di bawah ini kami akan memperkenalkan anda langkah demi langkah cara melaksanakan fungsi ini.

Kandungan soalan

Saya cuba menyemak sama ada nilai wujud sebelum menambahkan nilai baharu pada pangkalan data mongo tetapi saya mendapat ralat setiap kali.

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

Dokumen saya kelihatan seperti ini

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

.... }

Terdapat keadaan yang berbeza dan saya ingin memastikan bahawa keadaan yang sama tidak dihantar ke pangkalan data beberapa kali sebelum mengemas kininya dengan nilai baharu.

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
}

Cuba kemas kini

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
    }

kesilapan pemulangan

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

Penyelesaian

Gunakan penapis untuk mengecualikan dokumen dengan status yang ingin anda tambahkan. Jika status sudah ada dalam tatasusunan, penapis ini tidak akan sepadan dengan mana-mana dokumen. Operasi kemas kini hanya akan dilakukan jika status belum ditambah lagi:

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
}

Atas ialah kandungan terperinci Semak sama ada nilai dalam tatasusunan objek wujud golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Golang Docker Selenium ChromeArtikel seterusnya:Golang Docker Selenium Chrome