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?
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
bson.a
a> 只是一个 [] 接口{}
,并且 bson.d
是 []e
其中 e
type e struct { key string value interface{} }
bson.d
Jadi pada asasnya ialah senarai tersusun pasangan nilai kunci (sifat).
interface{}
时,您会得到一片切片,而不是多个地图。不打印类型信息,fmt
Jadi apabila anda menggunakan
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!