依赖包的选择:
impor "go.mongodb.org/mongo-driver/mongo"
go.mod
中写入
require go.mongodb.org/mongo-driver v1.9.0
连接
简单连接
// 简单连接 func main() { clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct") client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) } // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间 if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil { fmt.Println("Connected to MongoDB!") } }
分片连接
// shard分片连接 func main() { clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018") client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) } err = client.Ping(context.TODO(), clientOpts.ReadPreference) if err == nil { fmt.Println("Pong") } }
操作
结构体
// User 如果字段不大写的话mongoDB就没办法插入该字段 type User struct { Id int64 Name string Password string }
增
insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"}) if err != nil { log.Fatal(err) } fmt.Println("插入一条数据",insert.InsertedID) // 插入多个文档 users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}} insertMany, err := collection.InsertMany(context.TODO(), users) if err != nil { log.Fatal(err) } fmt.Println("插入多条数据",insertMany.InsertedIDs)
查
// 获取单条信息 var result User err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("单条查询结果为 %+v\n",result) // 获取多条信息 findOptions := options.Find() findOptions.SetLimit(2) // 获取多条信息并返回一个游标 cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions) if err != nil { log.Fatal(err) } // 通过迭代获取所有信息 for cur.Next(context.TODO()) { var elem User err := cur.Decode(&elem) if err != nil { log.Fatal(err) } results = append(results, elem) } if err := cur.Err(); err != nil { log.Fatal(err) } // 查询结束后关闭游标 cur.Close(context.TODO()) fmt.Printf("查询多条数据%+v\n",results)
改
// 更新一条数据 filter := bson.D{{"name","张三"}} update := bson.D{{ "$set",bson.D{ {"Password","321"}, }, }} updateOne, err := collection.UpdateOne(context.TODO(), filter, update) if err != nil { log.Fatal(err) } fmt.Println("更新一条数据",updateOne.ModifiedCount)
删
// 删除所有数据 many, err := collection.DeleteMany(context.TODO(), bson.D{{}}) if err != nil { log.Fatal(err) } fmt.Println("删除所有数据",many.DeletedCount)
完整代码
// 简单连接 func main() { clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct") client, err := mongo.Connect(context.TODO(), clientOpts) if err != nil { log.Fatal(err) } // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间 if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil { fmt.Println("Connected to MongoDB!") } // 断开连接 defer func() { err = client.Disconnect(context.TODO()) if err != nil { log.Fatal(err) } }() // 获取一个集合 collection := client.Database("test").Collection("user") // 删除所有数据 many, err := collection.DeleteMany(context.TODO(), bson.D{{}}) if err != nil { log.Fatal(err) } fmt.Println("删除所有数据",many.DeletedCount) // 插入一个文档 insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"}) if err != nil { log.Fatal(err) } fmt.Println("插入一条数据",insert.InsertedID) // 插入多个文档 users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}} insertMany, err := collection.InsertMany(context.TODO(), users) if err != nil { log.Fatal(err) } fmt.Println("插入多条数据",insertMany.InsertedIDs) // 获取单条信息 var result User err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("单条查询结果为 %+v\n",result) // 更新一条数据 filter := bson.D{{"name","张三"}} update := bson.D{{ "$set",bson.D{ {"Password","321"}, }, }} updateOne, err := collection.UpdateOne(context.TODO(), filter, update) if err != nil { log.Fatal(err) } fmt.Println("更新一条数据",updateOne.ModifiedCount) // 获取多条信息 findOptions := options.Find() findOptions.SetLimit(2) var results []User // 获取多条信息并返回一个游标 cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions) if err != nil { log.Fatal(err) } // 通过迭代获取所有信息 for cur.Next(context.TODO()) { var elem User err := cur.Decode(&elem) if err != nil { log.Fatal(err) } results = append(results, elem) } if err := cur.Err(); err != nil { log.Fatal(err) } // 查询结束后关闭游标 cur.Close(context.TODO()) fmt.Printf("查询多条数据%+v\n",results) } // User 如果字段不大写的话mongoDB就没办法插入该字段 type User struct { Id int64 Name string Password string }