在调用 Execute 之前,插入操作必须具有部署集

我有一个正在运行 MongoDB 的 AWS 实例。我正在尝试执行一个小型数据库操作,当下面包含的文件写入单个 go 文件中时,该操作似乎可以工作。当我尝试拆分它时,出现以下错误


在调用 Execute 之前,插入操作必须具有部署集


分割后的文件如下


连接.go


package db


import (

    "context"

    "fmt"

    "log"


    "go.mongodb.org/mongo-driver/mongo"

    "go.mongodb.org/mongo-driver/mongo/options"

)


var Client1 mongo.Client


func Connect() {

    // Set client options

    clientOptions := options.Client().ApplyURI("remote_url")


    // Connect to MongoDB

    Client1, err := mongo.Connect(context.TODO(), clientOptions)


    if err != nil {

        log.Fatal(err)

    }


    // Check the connection

    err = Client1.Ping(context.TODO(), nil)


    if err != nil {

        log.Fatal(err)

    }


    fmt.Println("Connected to MongoDB!")

}


func main() {

    fmt.Println("Connection to MongoDB done.")

}


主程序


package main


import (

    "context"

    "fmt"

    "log"


    "db"


    "go.mongodb.org/mongo-driver/bson"

)


// You will be using this Trainer type later in the program

type Trainer struct {

    Name string

    Age  int

    City string

}


func main() {


    db.Connect()

    collection := db.Client1.Database("test2").Collection("trainers")

    _ = collection


    fmt.Println("Created collection", _)


    ash := Trainer{"Ash", 10, "Pallet Town"}

    // misty := Trainer{"Misty", 10, "Cerulean City"}

    // brock := Trainer{"Brock", 15, "Pewter City"}


    insertResult, err := collection.InsertOne(context.TODO(), ash)

    if err != nil {

        log.Fatal(err)

    }


    fmt.Println("Inserted a single document: ", insertResult)


    err = db.Client1.Disconnect(context.TODO())


    if err != nil {

        log.Fatal(err)

    }

    fmt.Println("Connection to MongoDB closed.")

}


它们被放置在以下结构中


/src -> main.go

/src -> /db/connect.go


慕神8447489
浏览 135回答 2
2回答

茅侃侃

我相信您的问题是由变量阴影(wiki)引起的,并且您正在初始化局部变量而不是全局mongo.Client对象,因此会抛出您收到的错误。它发生在您的connect.go文件中,您在其中定义了两个Client1具有相同名称的不同变量:全球范围内的一员另一个在Connect()调用时被声明+初始化mongo.Connect()var Client1 mongo.Client // Client1 at global scopefunc Connect() {    // Set client options    clientOptions := options.Client().ApplyURI("remote_url")    // Connect to MongoDB    Client1, err := mongo.Connect(context.TODO(), clientOptions) // Client1 at local scope within Connect()这会导致全局范围内的值永远不会被初始化,因此 main.go 在尝试使用它时会崩溃,因为它为零。有多种方法可以解决此问题,例如在本地范围内使用不同的变量名称并将客户端分配给全局变量:    var Client1 mongo.Client    func Connect() {        // Set client options        clientOptions := options.Client().ApplyURI("remote_url")        // Connect to MongoDB        Client1Local, err := mongo.Connect(context.TODO(), clientOptions)        Client1 = *Client1Local或者避免声明局部变量并直接在全局范围内初始化该变量:    var Client1 *mongo.Client // Note that now Client1 is of *mongo.Client type    func Connect() {        // Set client options        clientOptions := options.Client().ApplyURI("remote_url")        // Connect to MongoDB        var err error        Client1, err = mongo.Connect(context.TODO(), clientOptions) // Now it's an assignment, not a declaration+assignment anymore有关 Golang 变量阴影讨论的更多信息,请参阅Issue#377 提案

MMMHUHU

尝试包含类似的内容,因为您省略了 db 目录,这可能是问题所在import "db/db"connect.go 中还有 main() ,一个项目应该只有一个主包和 main() 函数。---------------- Try what is discussed below exactly ------------好的,这是我的测试设置,其代码目录树与您的类似:[user@devsetup src]$ tree test        test        ├── dbtest        │   └── db        │       └── connect.go        ├── main // This is executable file        └── main.go    2 directories, 3 files在 connect.go 中,我没有更改任何内容,只是删除了上面提到的 main() 。确保仅使用导出的函数和变量,导出的函数/变量以大写字母开头。在 main.go 中,代码如下所示。* 进入dbtest/db目录并运行go install命令。然后进入项目目录,即test本例中的此处,然后运行go build main.go or go build .package mainimport (        "context"        "fmt"        "log"        "test/dbtest/db"        // "go.mongodb.org/mongo-driver/bson")// You will be using this Trainer type later in the programtype Trainer struct {        Name string        Age  int        City string}func main() {        db.Connect()        collection := db.Client1.Database("test2").Collection("trainers")        _ = collection        // fmt.Println("Created collection", _)        ash := Trainer{"Ash", 10, "Pallet Town"}        // misty := Trainer{"Misty", 10, "Cerulean City"}        // brock := Trainer{"Brock", 15, "Pewter City"}        insertResult, err := collection.InsertOne(context.TODO(), ash)        if err != nil {                log.Fatal(err)        }        fmt.Println("Inserted a single document: ", insertResult)        err = db.Client1.Disconnect(context.TODO())        if err != nil {                log.Fatal(err)        }        fmt.Println("Connection to MongoDB closed.")}这是我的二进制输出,因为我没有给出任何输入 url ,它抛出一个错误。似乎有效。我在 main.go 中注释掉了一个包和一行[user@devsetup test]$ ./test20xx/yy/zz aa:bb:cc error parsing uri: scheme must be "mongodb" or "mongodb+srv"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go