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

fhg3lkii  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(96)

我尝试使用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切片时

两种情况下存储的数据相似。

为什么在我们尝试访问数据时会出现数据差异?

cuxqih21

cuxqih211#

当使用interface{}时,这意味着由驱动程序选择它认为最适合表示来自MongoDB的数据的任何数据类型。
当您使用[]map[string]interface{}时,您明确地说您需要一片Map,其中每个Map可以表示一个文档。
当你使用interface{}时,你什么也没说,驱动程序会选择bson.A来表示数组,bson.D来表示文档。
bson.A只是一个[]interface{},而bson.D[]E,其中E

type E struct {
    Key   string
    Value interface{}
}

所以基本上bson.D是一个有序的键值对(属性)列表。
因此,当你使用interface{}时,你得到的是一个切片的切片,而不是多个Map。类型信息不会被打印出来,fmt包会打印切片和Map,它们都被括在方括号中。
如果你想查看类型,可以像这样打印:

fmt.Printf("%#v\n", result.Data)

使用[]map[string]interface{}时的输出:

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

使用interface{}时的输出:

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

相关问题