Heim >Backend-Entwicklung >Golang >Mongodb-Speicherung und -Abruf im Mongogo-Treiber
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?
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
bson.a
a> 只是一个 [] 接口{}
,并且 bson.d
是 []e
其中 e
type e struct { key string value interface{} }
bson.d
Im Grunde ist also eine geordnete Liste von Schlüssel-Wert-Paaren (Eigenschaften).
interface{}
时,您会得到一片切片,而不是多个地图。不打印类型信息,fmt
Wenn Sie also
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!