Heim > Backend-Entwicklung > Golang > Subtraktive Aggregation Mongo Dokumentation Golang

Subtraktive Aggregation Mongo Dokumentation Golang

WBOY
Freigeben: 2024-02-08 21:05:36
nach vorne
1152 Leute haben es durchsucht

减法聚合 Mongo 文档 Golang

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.

Frageninhalt

Ich habe dieses Dokument in Mongo

{
  "_id": {
    "$oid": "649d3d688a1f30bf82e77342"
  },
  "test_value": {
    "$numberlong": "10"
  }
}
Nach dem Login kopieren

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,
        })
    }
Nach dem Login kopieren

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?


Richtige Antwort


"$subtract": []interface{}{"test_value", 1}
Nach dem Login kopieren

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}
Nach dem Login kopieren

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)
    }
}
Nach dem Login kopieren

Und Datenerfassung initialisieren:

db.values.insert({ _id: objectid('649d3d688a1f30bf82e77342'), test_value: 10 })
Nach dem Login kopieren

(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
Nach dem Login kopieren

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},
            },
        },
    },
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage