Mongodb-Speicherung und -Abruf im Mongogo-Treiber

PHPz
Freigeben: 2024-02-06 09:39:07
nach vorne
1002 Leute haben es durchsucht

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)
}
Nach dem Login kopieren

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

ist

type e struct {
    key   string
    value interface{}
}
Nach dem Login kopieren
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)
Nach dem Login kopieren
[]map[string]接口{}Ausgabe bei Verwendung von

:

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

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

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!