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