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

Semak sama ada nilai dalam tatasusunan objek wujud golang

WBOY
Lepaskan: 2024-02-10 13:30:21
ke hadapan
1119 orang telah melayarinya

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

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",
Salin selepas log masuk

.... }

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"
)
Salin selepas log masuk

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
}
Salin selepas log masuk

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
    }
Salin selepas log masuk

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.]"
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan