Heim >Backend-Entwicklung >Golang >Mongodb-Speicherung und -Abruf im Mongogo-Treiber

Mongodb-Speicherung und -Abruf im Mongogo-Treiber

PHPz
PHPznach vorne
2024-02-06 09:39:071048Durchsuche

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

Frageninhalt

Ich versuche, Daten einzufügen und diese Daten mithilfe des Mongo-Go-Treibers aus Mongodb zu lesen. Ich verwende eine Struktur mit Datenfeldern. Wenn ich den Datentyp als Schnittstelle verwende, erhalte ich mehrere Karten, und wenn ich ihn als Kartenausschnitt spezifiziere, wird eine einzelne Karte zurückgegeben. Die Daten in Mongodb sind ähnlich.

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

Bei ausschließlicher Verwendung der Schnittstelle

Bei Verwendung von Kartenkacheln

Die in beiden Fällen gespeicherten Daten sind ähnlich.

Warum kommt es zu Datendiskrepanzen, wenn wir versuchen, auf die Daten zuzugreifen?


Richtige Antwort


Wenn Sie interface{} verwenden, bedeutet dies, dass Sie es dem Treiber überlassen, den Datentyp auszuwählen, der seiner Meinung nach die von mongodb eingehenden Daten am besten repräsentiert.

Wenn Sie []map[string]interface{} verwenden, geben Sie explizit an, dass Sie einen Kartenausschnitt wünschen, in dem jede Karte ein Dokument darstellen kann.

Wenn Sie interface{} 时,您什么也不说。驱动程序将选择 bson.a 来表示数组,并选择 bson.d verwenden, sagen Sie nichts. Der Treiber wählt bson.a zur Darstellung eines Arrays und

zur Darstellung eines Dokuments.

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

ist

type e struct {
    key   string
    value interface{}
}
bson.dIm Grunde ist

also eine geordnete Liste von Schlüssel-Wert-Paaren (Eigenschaften).

interface{} 时,您会得到一片切片,而不是多个地图。不打印类型信息,fmtWenn Sie also

verwenden, erhalten Sie ein Slice anstelle mehrerer Karten. Ohne Informationen zum Drucktyp druckt das Paket fmt Slices und Maps, beide in eckigen Klammern eingeschlossen.

Wenn Sie den Typ sehen möchten, drucken Sie ihn so aus:

fmt.printf("%#v\n", result.data)
[]map[string]接口{}Ausgabe bei Verwendung von

:

[]map[string]interface {}{map[string]interface {}{"key1":"using specific type", "key2":123}}
interface{}Ausgabe bei Verwendung von

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

Das obige ist der detaillierte Inhalt vonMongodb-Speicherung und -Abruf im Mongogo-Treiber. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen