Rumah > pembangunan bahagian belakang > Golang > Penyimpanan dan pengambilan Mongodb dalam pemandu mongogo

Penyimpanan dan pengambilan Mongodb dalam pemandu mongogo

PHPz
Lepaskan: 2024-02-06 09:39:07
ke hadapan
1057 orang telah melayarinya

mongogo 驱动程序中的 Mongodb 存储和检索

Kandungan soalan

Saya cuba memasukkan data dan membaca data itu daripada mongodb menggunakan pemandu mongo go. Saya menggunakan struktur dengan medan data. Apabila saya menggunakan jenis data sebagai antara muka saya mendapat berbilang peta dan apabila saya menentukannya sebagai kepingan peta ia mengembalikan satu peta. Data dalam mongodb adalah serupa.

package main

import (
    "context"
    "fmt"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Host struct {
    Hostname string                   `bson:"hostname"`
    Data     []map[string]interface{} `bson:"data"` //return single map
    // Data     interface{} `bson:"data"` //returns multiple maps

}

func main() {
    // Set up a MongoDB client
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        panic(err)
    }

    // Set up a MongoDB collection
    collection := client.Database("testdb").Collection("hosts")

    // Create a host object to insert into the database
    host := Host{
        Hostname: "example.com",
        Data: []map[string]interface{}{
            {"key1": "using specific type", "key2": 123},
        },
    }

    // Insert the host object into the collection
    _, err = collection.InsertOne(context.Background(), host)
    if err != nil {
        panic(err)
    }

    // Query the database for the host object
    filter := bson.M{"hostname": "example.com"}
    var result Host
    err = collection.FindOne(context.Background(), filter).Decode(&result)
    if err != nil {
        panic(err)
    }

    // Print the host object
    fmt.Println(result)
}
Salin selepas log masuk

Apabila menggunakan antara muka sahaja

Apabila menggunakan jubin peta

Data yang disimpan dalam kedua-dua kes adalah serupa.

Mengapa kami mendapat percanggahan data apabila kami cuba mengakses data?


Jawapan Betul


Apabila anda menggunakan interface{} ini bermakna anda menyerahkan kepada pemandu untuk memilih jenis data yang difikirkannya paling sesuai mewakili data yang tiba dari mongodb.

Apabila anda menggunakan []map[string]interface{} anda secara jelas menunjukkan bahawa anda mahukan kepingan peta, di mana setiap peta boleh mewakili dokumen.

Apabila anda menggunakan interface{} 时,您什么也不说。驱动程序将选择 bson.a 来表示数组,并选择 bson.d, anda tidak berkata apa-apa. Pemandu akan memilih bson.a untuk mewakili tatasusunan dan

untuk mewakili dokumen.

bson.a 只是一个 [] 接口{},并且 bson.d[]e 其中 e

ialah

type e struct {
    key   string
    value interface{}
}
Salin selepas log masuk
bson.dJadi pada asasnya

ialah senarai tersusun pasangan nilai kunci (sifat).

interface{} 时,您会得到一片切片,而不是多个地图。不打印类型信息,fmtJadi apabila anda menggunakan

anda mendapat satu keping dan bukannya berbilang peta. Tanpa maklumat jenis percetakan, pakej fmt mencetak kepingan dan peta, kedua-duanya disertakan dalam kurungan segi empat sama.

Jika anda ingin melihat jenisnya, cetak seperti ini:

fmt.printf("%#v\n", result.data)
Salin selepas log masuk
[]map[string]接口{}Keluaran apabila menggunakan

:

[]map[string]interface {}{map[string]interface {}{"key1":"using specific type", "key2":123}}
Salin selepas log masuk
interface{}Keluaran apabila menggunakan

: 🎜
primitive.A{primitive.D{primitive.E{Key:"key1", Value:"using specific type"}, primitive.E{Key:"key2", Value:123}}}
Salin selepas log masuk

Atas ialah kandungan terperinci Penyimpanan dan pengambilan Mongodb dalam pemandu mongogo. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan