go使用mongodb

mongodb的go语言驱动比较流行是mongo-go-drivermgo,前者是mongodb官方出的go驱动,mgo之前一直是个人在维护的,后来作者由于个原因已经放弃维护,后面出现mgo的分支还在继续维护不过更新频率还是比较低。本文主要介绍mongo-go-driver这个mongodb官方维护的版本,目前mongo-go-driver的版本已经是1.1.2已经可以用在生产环境。

mongodb client

目前大多数golang数据库驱动client 都会用连接池的方式来运行。 mongo-go-driver也不例外。 连接MongoDB代码如下:

client, err := mongo.Connect(context.Background(), options.Client().ApplyURI("mongodb://localhost:27017")) if err != nil { log.Fatal(err) } err = client.Ping(context.TODO(), nil) if err != nil { log.Fatal(err) } fmt.Println("Connected to MongoDB!")

运行下main.go程序

# go run main.go Connected to MongoDB!

这边需要注意下,采用连接池后一般很少自己close client而是继续放在链接池中举行供其他请求使用。 如果你确定已经不需要使用Client,可以使用如下代码收到关闭。

err = client.Disconnect(nilif err != nil { log.Fatal(err) } fmt.Println("Connection to MongoDB closed.")

获取集合handle

collection = client.Database("testing").Collection("students")

为collection创建索引

indexView := collection.Indexes() ret,err :=indexView.CreateOne(context.Background(), mongo.IndexModel{ Keys: bsonx.Doc{{"name", bsonx.Int32(-1)}}, Options: options.Index().SetName("testname").SetUnique(true), //这边设置了唯一限定,不设定默认不是唯一的 }) fmt.Println(ret,err)

CURD操作

添加

func add() { wida := Student{"wida", 32, "8001"} amy := Student{"amy", 25, "8002"} sunny := Student{"sunny", 35, "8003"} ret, err := collection.InsertOne(nil, wida) if err != nil { log.Fatal(err) } fmt.Println("写入一个文档", ret.InsertedID) student := []interface{}{amy, sunny} ret2, err := collection.InsertMany(nil, student) if err != nil { log.Fatal(err) } fmt.Println("写入多个文档 ", ret2.InsertedIDs) }

查询

func find() { var result Student err := collection.FindOne(nil, bson.D{{"name", "amy"}, {"age", 25}}).Decode(&result) if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", result) findOptions := options.Find() findOptions.SetLimit(3) var results []*Student cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions) if err != nil { log.Fatal(err) } for cur.Next(context.TODO()) { var elem Student 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(nil) for _,r := range results { fmt.Printf("%+v\n", r) } }

更新

filter := bson.D{{"no", "8001"}} update := bson.D{ {"$set", bson.D{ {"age", 33}, {"name", "wida2"}, }}, } ret, err := collection.UpdateOne(nil, filter, update) if err != nil { log.Fatal(err) } fmt.Printf("Matched %v documents and updated %v documents.\n", ret.MatchedCount, ret.ModifiedCount) }

删除

func del() { deleteResult, err := collection.DeleteMany(context.TODO(), bson.D{{}}) // 这边删除全部文档 if err != nil { log.Fatal(err) } fmt.Printf("Deleted %v documents\n", deleteResult.DeletedCount) }

参考文档