【问题标题】:how to create a mongo db package如何创建一个mongodb包
【发布时间】:2020-05-10 03:50:59
【问题描述】:

我想构建一个基础设施,它是项目的一个包。以便其他开发人员可以导入此包对数据库执行 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)

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

【问题讨论】:

    标签: mongodb go package


    【解决方案1】:

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

    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)
    

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

    【讨论】:

    • @Emily 很高兴听到它有帮助。随意支持这个答案,让有类似问题的人知道这是一个潜在的解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多