Dans cet article, l'éditeur PHP Baicao vous présentera comment vérifier si la valeur du tableau d'objets existe dans Golang. Au cours du processus de développement, nous devons souvent opérer et juger des tableaux, et dans certains cas, nous devons vérifier si une certaine valeur existe dans un tableau d'objets. Ce processus peut impliquer le parcours de tableaux, la comparaison de valeurs, etc. Ci-dessous, nous vous présenterons étape par étape comment implémenter cette fonction.
J'essaie de vérifier si une nouvelle valeur existe avant de l'ajouter à une base de données mongo, mais j'obtiens une erreur à chaque fois.
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))
Mon document ressemble à ceci
{ "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",
.... }
Il existe différents états et je veux m'assurer que le même état n'est pas envoyé plusieurs fois à la base de données avant de le mettre à jour avec les nouvelles valeurs.
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 }
Essayez de mettre à jour
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 }
erreur de retour
"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.]"
Utilisez un filtre pour exclure les documents avec le statut que vous souhaitez ajouter. Si le statut est déjà présent dans le tableau, ce filtre ne correspondra à aucun document. L'opération de mise à jour ne sera effectuée que si le statut n'a pas encore été ajouté :
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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!