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