首页 > 解决方案 > 如何在单独的函数中连接到 MongoDB?

问题描述

在这段代码中,我将 MongoDB 数据库与 golang 连接并在其中插入数据。我想将Connection()功能与Insertdata()功能分开(与我制作的其他功能,如Finddata()Deletedata()等)。

但是当我尝试将它分开时,函数中的client变量给了我一条消息,而来自的变量给了我一条消息。如何处理?Connection()it is declared but not usedclientInsertdata()it is undeclared

func Connection() {
    // Set client options
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

    // Connect to MongoDB
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }
}
func Insertdata(inputData interface{}) {
    Connection()
    err, collection := client.Database("PMS").Collection("dataStored")
    collection.InsertOne(context.TODO(), inputData)
    if err != nil {
        log.Fatal(err)
    }
}

标签: databasemongodbgo

解决方案


在 Go 中,我们通常将依赖项存储在结构类型字段中。围绕数据库定义一些抽象,这些抽象将包含一个*mongo.Client(或该类型满足的接口):

type DB struct {
  client *mongo.Client
}

DB在您的类型的工厂函数中实例化客户端一次:

func NewDB(ctx context.Context, uri string) (*DB, error) {
    clientOptions := options.Client().ApplyURI(uri)
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        return nil, err
    }
    db := DB {
        client: client,
    }
    return &db, nil
}

然后声明Insertdata方法(不是函数*DB。这样,您将能够通过其接收器在该方法中使用(和重用)客户端。

func (db *DB) Insertdata(ctx context.Context, inputData interface{}) error {
    collection := db.client.Database("PMS").Collection("dataStored")
    _, err := collection.InsertOne(ctx, inputData)
    return err
}

还:

  • 不要context.TODO()在生产代码中硬编码。添加一个context.Context参数以使相关函数和方法可以从调用堆栈的更高层取消。
  • 不要忽略错误。如果您无法在函数或方法中处理它们,请将它们返回给调用者。

推荐阅读