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

Penyimpanan dan pengambilan Mongodb dalam pemandu mongogo

PHPz
PHPzke hadapan
2024-02-06 09:39:071004semak imbas

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

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 a> 只是一个 [] 接口{},并且 bson.d[]e 其中 e

ialah

type e struct {
    key   string
    value interface{}
}
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)
[]map[string]接口{}Keluaran apabila menggunakan

:

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

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

Atas ialah kandungan terperinci Penyimpanan dan pengambilan Mongodb dalam pemandu mongogo. 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