首页 > 解决方案 > 如何创建一个 mongo db 包

问题描述

我想建立一个基础设施,它是项目的一个包。以便其他开发人员可以导入此包对数据库执行 CRUD 操作。

但是我在测试过程中遇到了一个错误:

type Students struct {
    Name      string
    Age int
}

type InsertOneResult struct {
    InsertedID interface{}
}

func dbGetOne(coll, document interface{}) (*InsertOneResult, error) {
...
}

func dbUpdateOne(coll, document interface{}) (*InsertOneResult, error) {
    ...
}

func dbDeleteOne(coll, document interface{}) (*InsertOneResult, error) {
    ...
}

func dbInsertOne(coll, document interface{}) (*InsertOneResult, error) {
    res, err := coll.InsertOne(context.TODO(), document)
    if err != nil {
        log.Fatal(err)
    }
    return &InsertOneResult{InsertedID: res[0]}, err
}

func main() {
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://<user>:<password>@<host>:<port>/<dbname>"))
    if err != nil {
        log.Fatal(err)
    }

    ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }

    coll := client.Database("db").Collection("students")
    data := Students{"Amy", 10}
    res, err := dbInsertOne(coll, data)

    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("inserted document with ID %v\n", res.InsertedID)
}

这是错误:

./main.go:24:18: coll.InsertOne undefined (type interface {} is interface with no methods)

有没有办法解决这个问题?提前致谢。

标签: mongodbgopackage

解决方案


嘿,看起来错误可能来自类型转换问题。解决方案是在函数中明确定义collas的类型。这允许编译器在编译时找出输入的结构,而不必依赖抽象接口。*mongo.CollectiondbInsertOne()

func dbInsertOne(coll *mongo.Collection, document interface{}) (*InsertOneResult, error) {
    res, err := coll.InsertOne(context.TODO(), document)
    if err != nil {
        log.Fatal(err)
    }
    return &InsertOneResult{InsertedID: res.InsertedID}, err
}

我会进一步建议,document如果可能的话,第二个参数也应该是一个类型化的已知术语。例如

func dbInsertOne(coll *mongo.Collection, document Students)

静态类型将有很大帮助并消除任何混乱。


推荐阅读