经过多年依赖社区驱动程序,如mgo和globalsign/mgo,去年 MongoDB宣布他们正在构建自己的解决方案。去年 3 月他们发布了1.0.0 版本,下面我们来看看如何使用官方驱动进行一些正常的操作。
首先,您需要使用 go get 下载驱动程序。
go.mongodb.org/mongo-driver/mongo
进入全屏模式 退出全屏模式
假设您的 MongoDB 安装使用默认设置,您的方法应该是这样的:
package main
import (
"context"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func GetClient() *mongo.Client {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.NewClient(clientOptions)
if err != nil {
log.Fatal(err)
}
err = client.Connect(context.Background())
if err != nil {
log.Fatal(err)
}
return client
}
进入全屏模式 退出全屏模式
为了测试与 mongo 的连接,我们可以调用一个名为 Ping 的函数,并检查是否返回任何错误。否则,out 连接成功。
func main() {
c := GetClient()
err := c.Ping(context.Background(), readpref.Primary())
if err != nil {
log.Fatal("Couldn't connect to the database", err)
} else {
log.Println("Connected!")
}
}
进入全屏模式 退出全屏模式
civilactheroes
{
"_id" : ObjectId("5d0574824d9f7ff15e989171"),
"name" : "Tony Stark",
"alias" : "Iron Man",
"signed" : true
}
{
"_id" : ObjectId("5d0574d74d9f7ff15e989172"),
"name" : "Steve Rodgers",
"alias" : "Captain America",
"signed" : false
}
{
"_id" : ObjectId("5d0574e94d9f7ff15e989173"),
"name" : "Vision",
"alias" : "Vision",
"signed" : true
}
{
"_id" : ObjectId("5d0575344d9f7ff15e989174"),
"name" : "Clint Barton",
"alias" : "Hawkeye",
"signed" : false
}
进入全屏模式 退出全屏模式
要使用这些文档,如果我们创建一个表示所有字段及其 json 名称的结构会更好。
type Hero struct {
Name string `json:"name"`
Alias string `json:"alias"`
Signed bool `json:"signed"`
}
进入全屏模式 退出全屏模式
现在让我们创建一个方法,它将返回所有期望 2 个参数的英雄:MongoDB 客户端和一个表示过滤器的 bson.M。如果此过滤器为空,该方法将返回所有文档。
import (
"context"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
func ReturnAllHeroes(client *mongo.Client, filter bson.M) []*Hero {
var heroes []*Hero
collection := client.Database("civilact").Collection("heroes")
cur, err := collection.Find(context.TODO(), filter)
if err != nil {
log.Fatal("Error on Finding all the documents", err)
}
for cur.Next(context.TODO()) {
var hero Hero
err = cur.Decode(&hero)
if err != nil {
log.Fatal("Error on Decoding the document", err)
}
heroes = append(heroes, &hero)
}
return heroes
}
进入全屏模式 退出全屏模式
细分是:
collection
collection
heroes
如果我们在 main 函数中运行,我们的返回将是:
heroes := ReturnAllHeroes(c, bson.M{})
for _, hero := range heroes {
log.Println(hero.Name, hero.Alias, hero.Signed)
}
2019/06/15 21:07:00 Tony Stark Iron Man true
2019/06/15 21:07:00 Steve Rodgers Captain America false
2019/06/15 21:07:00 Vision Vision true
2019/06/15 21:07:00 Clint Barton Hawkeye false
进入全屏模式 退出全屏模式
要仅检索签署Sokovia Accords的英雄,我们只需更改过滤器。
heroes := ReturnAllHeroes(c, bson.M{"signed": true})
2019/06/15 21:18:04 Tony Stark Iron Man true
2019/06/15 21:18:04 Vision Vision true
进入全屏模式 退出全屏模式
为了只检索一个英雄,我们的新方法是这样的:
func ReturnOneHero(client *mongo.Client, filter bson.M) Hero {
var hero Hero
collection := client.Database("civilact").Collection("heroes")
documentReturned := collection.FindOne(context.TODO(), filter)
documentReturned.Decode(&hero)
return hero
}
进入全屏模式 退出全屏模式
电话将是:
hero := ReturnOneHero(c, bson.M{"name": "Vision"})
log.Println(hero.Name, hero.Alias, hero.Signed)
2019/06/15 22:55:44 Vision Vision true
进入全屏模式 退出全屏模式
现在,增加我们的英雄集合并插入,例如奇异博士:新方法将是这样的:
func InsertNewHero(client *mongo.Client, hero Hero) interface{} {
collection := client.Database("civilact").Collection("heroes")
insertResult, err := collection.InsertOne(context.TODO(), hero)
if err != nil {
log.Fatalln("Error on inserting new Hero", err)
}
return insertResult.InsertedID
}
进入全屏模式 退出全屏模式
ReturnOneHero
hero = Hero{Name: "Stephen Strange", Alias: "Doctor Strange", Signed: true}
insertedID := InsertNewHero(c, hero)
log.Println(insertedID)
hero = ReturnOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println(hero.Name, hero.Alias, hero.Signed)
进入全屏模式 退出全屏模式
RemoveOneHero
func RemoveOneHero(client *mongo.Client, filter bson.M) int64 {
collection := client.Database("civilact").Collection("heroes")
deleteResult, err := collection.DeleteOne(context.TODO(), filter)
if err != nil {
log.Fatal("Error on deleting one Hero", err)
}
return deleteResult.DeletedCount
}
进入全屏模式 退出全屏模式
这就是我们检查的方式:
heroesRemoved := RemoveOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println("Heroes removed count:", heroesRemove
hero = ReturnOneHero(c, bson.M{"alias": "Doctor Strange"})
log.Println("Is Hero empty?", hero == Hero{ })
进入全屏模式 退出全屏模式
UpdateHero
func UpdateHero(client *mongo.Client, updatedData bson.M, filter bson.M) int64 {
collection := client.Database("civilact").Collection("heroes")
atualizacao := bson.D{ {Key: "$set", Value: updatedData} }
updatedResult, err := collection.UpdateOne(context.TODO(), filter, atualizacao)
if err != nil {
log.Fatal("Error on updating one Hero", err)
}
return updatedResult.ModifiedCount
}
进入全屏模式 退出全屏模式
而已!常规的 CRUD 操作已涵盖,我们的英雄可以决定他们的命运。
这些示例的所有代码都可在此处获得,本教程也发布在我的博客上。这是驱动程序的官方repo和官方文档
如有任何问题、建议或错误,请随时与我联系。