Der PHP-Editor Zimo stellt Ihnen heute das subtraktive Aggregation-Mongo-Dokument Golang vor. In der Golang-Entwicklung ist die Verwendung von MongoDB als Datenbank eine sehr häufige Wahl. MongoDB bietet ein leistungsstarkes Aggregationsframework, das verschiedene komplexe Aggregationsvorgänge für Dokumente ausführen kann. Unter diesen ist die subtraktive Aggregation eine spezielle Aggregationsoperation, mit der die Differenz eines bestimmten Felds im Dokument berechnet werden kann. In diesem Artikel wird detailliert beschrieben, wie die subtraktive Aggregation zur Verarbeitung von Mongo-Dokumenten in Golang verwendet wird, um Entwicklern dabei zu helfen, diese Funktion besser zu verstehen und anzuwenden.
Ich habe dieses Dokument in Mongo
{ "_id": { "$oid": "649d3d688a1f30bf82e77342" }, "test_value": { "$numberlong": "10" } }
Ich möchte „test_value“ mit diesem Golang-Code um eins dekrementieren
jsonInput := []map[string]interface{}{ { "$match": map[string]interface{}{ "test_value": 10, }, }, { "$set": map[string]interface{}{ "test_value": map[string]interface{}{ "$subtract": []interface{}{"test_value", 1}}, }, }, }) value, bsonByte, errMarshal := bson.MarshalValue(jsonInput) if errMarshal != nil { modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot Marshal jsonInput to BSONByte", true, errMarshal) ctx.IndentedJSON(200, gin.H{ "error": errMarshal.Error(), }) return } fmt.Println(value) bsonD := bson.A{} errUnmarshal1 := bson.UnmarshalValue(value, bsonByte, &bsonD) if errUnmarshal1 != nil { modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot Unmarshal BSONByte to BSOND", true, errUnmarshal1) ctx.IndentedJSON(200, gin.H{ "error": errUnmarshal1.Error(), }) return } _, err := Client.Database("rhanov_queries").Collection(collectionName).Aggregate(ContextMongo, bsonD) if err != nil { modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot aggregate document to Mongo", true, err) ctx.IndentedJSON(200, gin.H{ "error": err, }) }
Ich habe diesen Fehler erhalten
„Das Dokument kann nicht in Mongo aggregiert werden. Der primitive Typ kann nicht in das BSON-Dokument gemarshallt werden: Writerarray kann nur in das Array schreiben, wenn es sich um ein Element oder einen Wert handelt, aber auf der obersten Ebene.“
Was habe ich falsch gemacht?
"$subtract": []interface{}{"test_value", 1}
Beachten Sie, dass es ein "test_value"
是一个文字。该表达式的意思是从字符串test_value
中减去数字1,这是无效的,不是你想要的。您想改为引用字段路径。因此,您应该在其前面加上 $
Präfix gibt (siehe Aggregationsausdrücke). Hier ist der korrigierte Code:
"$subtract": []interface{}{"$test_value", 1}
ps 1:
Um anderen die Untersuchung des Problems zu erleichtern, stellen Sie bitte in Zukunft eine minimale ausführbare Reproduktion zur Verfügung, zum Beispiel:
package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { jsoninput := []map[string]interface{}{ { "$match": map[string]interface{}{ "test_value": 10, }, }, { "$set": map[string]interface{}{ "test_value": map[string]interface{}{ "$subtract": []interface{}{"test_value", 1}, // `test_value` should be prefixed with $ like this: // "$subtract": []interface{}{"$test_value", 1}, }, }, }, } typ, buf, err := bson.marshalvalue(jsoninput) if err != nil { panic(err) } fmt.println(typ) var bsond bson.a if err := bson.unmarshalvalue(typ, buf, &bsond); err != nil { panic(err) } client, err := mongo.connect(context.background(), options.client().applyuri("mongodb://localhost")) if err != nil { panic(err) } collection := client.database("demo").collection("values") cur, err := collection.aggregate(context.background(), bsond) if err != nil { panic(err) } defer cur.close(context.background()) for cur.next(context.background()) { fmt.printf("%+v", cur.current) } }
Und Datenerfassung initialisieren:
db.values.insert({ _id: objectid('649d3d688a1f30bf82e77342'), test_value: 10 })
(ausgeführt in der Mongodb-Shell)
Bei Verwendung des Pakets go.mongodb.org/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5e3331303931733a2c37283b2c1e286f706f6c706e">[电子邮件受保护]</a>
和 mongo:5.0.8
erhalte ich folgende Fehlermeldung:
panic: (typemismatch) failed to optimize pipeline :: caused by :: can't $subtract int from string
ps 2:
Wenn Sie es nicht wissen, können Sie die bsond
-Variable direkt wie folgt erstellen:
bsonD := bson.A{ bson.M{ "$match": bson.M{ "test_value": 10, }, }, bson.M{ "$set": bson.M{ "test_value": bson.M{ "$subtract": bson.A{"$test_value", 1}, }, }, }, }
ps 3:
Der von Ihnen angezeigte Code weist einen Syntaxfehler auf (jsoninput
的简短声明末尾有一个额外的 )
)。更正此错误后,我认为它不会导致您在问题中显示的错误。我相信错误是针对另一个 jsoninput
Wert.
Das obige ist der detaillierte Inhalt vonSubtraktive Aggregation Mongo Dokumentation Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!