我尝试使用mongo驱动程序插入数据并从mongodb读取数据。我使用的是一个具有数据字段的结构体。当我使用数据类型作为接口时,我会得到多个map,当我将其指定为map切片时,它会返回一个map。数据在mongodb中类似。
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)
}
仅使用接口
时
当使用Map切片时
两种情况下存储的数据相似。
为什么在我们尝试访问数据时会出现数据差异?
1条答案
按热度按时间cuxqih211#
当使用
interface{}
时,这意味着由驱动程序选择它认为最适合表示来自MongoDB的数据的任何数据类型。当您使用
[]map[string]interface{}
时,您明确地说您需要一片Map,其中每个Map可以表示一个文档。当你使用
interface{}
时,你什么也没说,驱动程序会选择bson.A
来表示数组,bson.D
来表示文档。bson.A
只是一个[]interface{}
,而bson.D
是[]E
,其中E
是所以基本上
bson.D
是一个有序的键值对(属性)列表。因此,当你使用
interface{}
时,你得到的是一个切片的切片,而不是多个Map。类型信息不会被打印出来,fmt
包会打印切片和Map,它们都被括在方括号中。如果你想查看类型,可以像这样打印:
使用
[]map[string]interface{}
时的输出:使用
interface{}
时的输出: