Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjumlahan Tolak Dokumentasi Mongo Golang

Penjumlahan Tolak Dokumentasi Mongo Golang

WBOY
WBOYke hadapan
2024-02-08 21:05:361116semak imbas

减法聚合 Mongo 文档 Golang

Editor PHP Zimo akan memperkenalkan kepada anda dokumen Mongo penjumlahan tolak Golang hari ini. Dalam pembangunan Golang, menggunakan MongoDB sebagai pangkalan data adalah pilihan yang sangat biasa. MongoDB menyediakan rangka kerja pengagregatan yang berkuasa yang boleh melaksanakan pelbagai operasi pengagregatan kompleks pada dokumen. Antaranya, penjumlahan tolak ialah operasi pengagregatan khas yang boleh digunakan untuk mengira perbezaan medan tertentu dalam dokumen. Artikel ini akan memperkenalkan secara terperinci cara menggunakan pengagregatan tolak untuk memproses dokumen Mongo di Golang, membantu pembangun lebih memahami dan menggunakan fungsi ini.

Kandungan soalan

Saya ada dokumen ini dalam mongo

{
  "_id": {
    "$oid": "649d3d688a1f30bf82e77342"
  },
  "test_value": {
    "$numberlong": "10"
  }
}

Saya ingin mengurangkan "nilai_ujian" dengan satu menggunakan kod golang ini

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,
        })
    }

Saya mendapat ralat ini

"Tidak dapat mengagregatkan dokumen kepada mongo. Tidak dapat menyusun jenis primitif kepada dokumen bson: writerarray hanya boleh menulis kepada tatasusunan apabila pada elemen atau nilai tetapi di peringkat atas"

Apa salah saya?


Jawapan betul


"$subtract": []interface{}{"test_value", 1}

Perhatikan bahawa terdapat "test_value" 是一个文字。该表达式的意思是从字符串test_value中减去数字1,这是无效的,不是你想要的。您想改为引用字段路径。因此,您应该在其前面加上 $ awalan (lihat Ungkapan pengagregatan). Berikut ialah kod yang diperbetulkan:

"$subtract": []interface{}{"$test_value", 1}

ps 1:

Untuk memudahkan orang lain menyiasat isu tersebut, sila berikan minimum boleh laksana yang boleh dihasilkan semula pada masa hadapan, contohnya:

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)
    }
}

Dan mulakan pengumpulan data:

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

(dilaksanakan dalam mongodb shell)

Menggunakan pakej go.mongodb.org/87128337c06e8a1b9bab06a01f40021b[电子邮件受保护]5db79b134e9f6b82c0b36e0489ee08edmongo:5.0.8, ralat yang saya dapat ialah:

panic: (typemismatch) failed to optimize pipeline :: caused by :: can't $subtract int from string

ps 2:

Jika anda tidak tahu, anda boleh terus membuat pembolehubah bsond seperti ini:

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:

Kod yang anda tunjukkan mempunyai ralat sintaks (nilai jsoninput 的简短声明末尾有一个额外的 ))。更正此错误后,我认为它不会导致您在问题中显示的错误。我相信错误是针对另一个 jsoninput.

Atas ialah kandungan terperinci Penjumlahan Tolak Dokumentasi Mongo Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam