cari
Rumahpembangunan bahagian belakangGolangPenjumlahan Tolak Dokumentasi Mongo Golang

减法聚合 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/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5e3331303931733a2c37283b2c1e286f706f6c706e">[电子邮件受保护]</a>mongo: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. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Golang vs Python: Konvensyen dan MultithreadingGolang vs Python: Konvensyen dan MultithreadingApr 17, 2025 am 12:20 AM

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Golang dan C: Perdagangan dalam prestasiGolang dan C: Perdagangan dalam prestasiApr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang vs Python: Aplikasi dan Kes GunakanGolang vs Python: Aplikasi dan Kes GunakanApr 17, 2025 am 12:17 AM

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang vs Python: Perbezaan dan Persamaan UtamaGolang vs Python: Perbezaan dan Persamaan UtamaApr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Golang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranGolang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranApr 17, 2025 am 12:12 AM

Dalam apa aspek Golang dan Python lebih mudah digunakan dan mempunyai lengkung pembelajaran yang lebih lancar? Golang lebih sesuai untuk kesesuaian tinggi dan keperluan prestasi tinggi, dan lengkung pembelajaran agak lembut untuk pemaju dengan latar belakang bahasa C. Python lebih sesuai untuk sains data dan prototaip cepat, dan lengkung pembelajaran sangat lancar untuk pemula.

Perlumbaan Prestasi: Golang vs CPerlumbaan Prestasi: Golang vs CApr 16, 2025 am 12:07 AM

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang vs C: Contoh kod dan analisis prestasiGolang vs C: Contoh kod dan analisis prestasiApr 15, 2025 am 12:03 AM

Golang sesuai untuk pembangunan pesat dan pengaturcaraan serentak, manakala C lebih sesuai untuk projek yang memerlukan prestasi yang melampau dan kawalan asas. 1) Model Concurrency Golang memudahkan pengaturcaraan konvensyen melalui goroutine dan saluran. 2) Pengaturcaraan templat C menyediakan kod generik dan pengoptimuman prestasi. 3) Koleksi sampah Golang adalah mudah tetapi boleh menjejaskan prestasi. Pengurusan memori C adalah rumit tetapi kawalannya baik -baik saja.

Impak Golang: Kelajuan, Kecekapan, dan KesederhanaanImpak Golang: Kelajuan, Kecekapan, dan KesederhanaanApr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivielythroughspeed, efficiency, andsimplicity.1) Speed: goCompilesquicklyandrunsefficiently, idealforlargeproject.2) Kecekapan: ITSComprehensivestandardlibraryraryrarexternaldependencies, enhingdevelyficiency.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft