# Golang操作MongoDB数据库 ## 下载安装MongoDB https://www.mongodb.com/try/download/community2 https://www.mongodb.com/download-center/community/releases 连接客户端 ```bash # 打开客户端 mongo # 创建数据库 use go_db; # 创建集合 db.createCollection('student'); ``` ## 下载驱动 https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo ``` go get go.mongodb.org/mongo-driver/mongo ``` ## 连接到mongodb数据库 ```go package main import ( "context" "log" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { // 设置客户端连接配置 // db_url := "mongodb://root:123456@localhost:27017" db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) // 连接到mongo client, _ := mongo.Connect(context.TODO(), clientOptions) // 连接检查 err := client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } } ``` ## BSON 二进制编码的json 类型D家族 - D BSON文档 - M 无序map - A BSON数组 - E D里面的一个元素 示例 ```go package main import ( "fmt" "go.mongodb.org/mongo-driver/bson" ) func main() { d := bson.D{{"name", "age"}} fmt.Printf("d: %v\n", d) // d: [{name age}] } ``` ## 添加文档 插入单条记录 ```go package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type Student struct { Name string Age int } func main() { // 连接到mongo db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) client, _ := mongo.Connect(context.TODO(), clientOptions) student := Student{ Name: "Tom", Age: 23, } collection := client.Database("go_db").Collection("student") ior, _ := collection.InsertOne(context.TODO(), student) fmt.Printf("ior.InsertedID: %v\n", ior.InsertedID) // ior.InsertedID: ObjectID("634822c35881b85ab2aa138e") } ``` 插入多条记录 ```go package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type Student struct { Name string Age int } func main() { // 连接到mongo db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) client, _ := mongo.Connect(context.TODO(), clientOptions) student1 := Student{ Name: "Steve", Age: 24, } student2 := Student{ Name: "Jack", Age: 25, } students := []interface{}{student1, student2} collection := client.Database("go_db").Collection("student") imr, _ := collection.InsertMany(context.TODO(), students) fmt.Printf("imr.InsertedIDs: %v\n", imr.InsertedIDs) // imr.InsertedIDs: [ // ObjectID("634823e52758c71e01e1e78f") // ObjectID("634823e52758c71e01e1e790") // ] } ``` ## 查找文档 ```go package main import ( "context" "fmt" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() // 连接到mongo db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) client, _ := mongo.Connect(ctx, clientOptions) defer client.Disconnect(ctx) // 查询数据 collection := client.Database("go_db").Collection("student") // 查询所有 // cursor, _ := collection.Find(ctx, bson.D{}) // 增加查询条件 name = "Tom" cursor, _ := collection.Find(ctx, bson.D{{"name", "Tom"}}) defer cursor.Close(ctx) // 遍历查询结果 for cursor.Next(ctx) { var result bson.D cursor.Decode(&result) fmt.Printf("result: %v\n", result) // result: [{_id ObjectID("634822c35881b85ab2aa138e")} {name Tom} {age 23}] } } ``` ## 更新文档 ```go package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { ctx := context.TODO() // 连接到mongo db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) client, _ := mongo.Connect(ctx, clientOptions) defer client.Disconnect(ctx) // 更新数据 collection := client.Database("go_db").Collection("student") cursor, _ := collection.UpdateOne(ctx, bson.D{{"name", "Tom"}}, bson.D{{"$set", bson.D{{"name", "Tom-1"}, {"age", 23}}}}, ) fmt.Printf("cursor.ModifiedCount: %v\n", cursor.ModifiedCount) // cursor.ModifiedCount: 1 } ``` ## 删除数据 ```go package main import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { ctx := context.TODO() // 连接到mongo db_url := "mongodb://localhost:27017" clientOptions := options.Client().ApplyURI(db_url) client, _ := mongo.Connect(ctx, clientOptions) defer client.Disconnect(ctx) // 删除数据 collection := client.Database("go_db").Collection("student") cursor, _ := collection.DeleteOne(ctx, bson.D{{"name", "Tom"}}, ) fmt.Printf("cursor.DeletedCount: %v\n", cursor.DeletedCount) // cursor.DeletedCount: 1 } ```