下载安装MongoDB

本文视频教程:https://www.bilibili.com/vide...

关注公众号,支付课程材料和源码

下载地址:

https://www.mongodb.com/download-center/community

关上客户端

mongo.exe

创立数据库

use go_db;

创立汇合

 db.createCollection("student");

下载安装驱动并连贯数据库

下载地址:

https://www.mongodb.com/download-center/community

关上客户端

mongo.exe

创立数据库

use go_db;

创立汇合

 db.createCollection("student");

下载驱动

go get github.com/mongodb/mongo-go-driver

连贯mongoDB

package mainimport (    "context"    "fmt"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options"    "log")var client *mongo.Clientfunc initDB()  {    // 设置客户端连贯配置    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")    // 连贯到MongoDB    var err error    client, err = mongo.Connect(context.TODO(), clientOptions)    if err != nil {        log.Fatal(err)    }    // 查看连贯    err = client.Ping(context.TODO(), nil)    if err != nil {        log.Fatal(err)    }    fmt.Println("Connected to MongoDB!")}func main() {    initDB()}

运行后果

Connected to MongoDB!

BSON简介

MongoDB中的JSON文档存储在名为BSON(二进制编码的JSON)的二进制示意中。与其余将JSON数据存储为简略字符串和数字的数据库不同,BSON编码扩大了JSON示意,使其蕴含额定的类型,如int、long、date、浮点数和decimal128。这使得应用程序更容易牢靠地解决、排序和比拟数据。

连贯MongoDB的Go驱动程序中有两大类型示意BSON数据:DRaw

类型D家族被用来简洁地构建应用本地Go类型的BSON对象。这对于结构传递给MongoDB的命令特地有用。D家族包含四类:

  • D:一个BSON文档。这种类型应该在程序重要的状况下应用,比方MongoDB命令。
  • M:一张无序的map。它和D是一样的,只是它不放弃程序。
  • A:一个BSON数组。
  • E:D外面的一个元素。

要应用BSON,须要先导入上面的包:

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

上面是一个应用D类型构建的过滤器文档的例子,它能够用来查找name字段与’张三’或’李四’匹配的文档:

bson.D{{    "name",    bson.D{{        "$in",        bson.A{"张三", "李四"},    }},}}

Raw类型家族用于验证字节切片。你还能够应用Lookup()从原始类型检索单个元素。如果你不想要将BSON反序列化成另一种类型的开销,那么这是十分有用的。这个教程咱们将只应用D类型。

增加文档

创立一个构造体

type Student struct {    Name string    Age int}

增加单个文档

应用collection.InsertOne()办法插入一条文档记录:

func insertOne(s Student) {    initDB()    collection := client.Database("go_db").Collection("student")    insertResult, err := collection.InsertOne(context.TODO(), s)    if err != nil {        log.Fatal(err)    }    fmt.Println("Inserted a single document: ", insertResult.InsertedID)}

测试

func main() {    s := Student{Name: "tom", Age: 20}    insertOne(s)}

运行后果

Connected to MongoDB!Inserted a single document:  ObjectID("61124558682f5c9583330222")

客户端查看

mongodb 关上客户端use go_dbdb.student.find()db.student.remove({}) // 删除所有

插入多个文档

应用collection.InsertMany()办法插入多条文档记录:

func insertMore(students []interface{}) {    //students := []interface{}{s2, s3}    initDB()    collection := client.Database("go_db").Collection("student")    insertManyResult, err := collection.InsertMany(context.TODO(), students)    if err != nil {        log.Fatal(err)    }    fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)}

测试

func main() {    s := Student{Name: "tom", Age: 20}    s1 := Student{Name: "kite", Age: 21}    s2 := Student{Name: "rose", Age: 22}    students := []interface{}{s, s1, s2}    insertMore(students)}

运行后果

Connected to MongoDB!Inserted multiple documents:  [ObjectID("611246c56637c3554426bc92") ObjectID("611246c56637c3554426bc93") ObjectID("611246c56637c3554426bc94")]

更多办法请查阅官网文档。

查找文档

package mainimport (    "context"    "fmt"    "log"    "time"    "go.mongodb.org/mongo-driver/bson"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options")var client *mongo.Clientfunc initDB() {    // 设置客户端连贯配置    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")    co := options.Client().ApplyURI("mongodb://localhost:27017")    mongo.Connect(context.TODO(), co)    // 连贯到MongoDB    var err error    client, err = mongo.Connect(context.TODO(), clientOptions)    if err != nil {        log.Fatal(err)    }    client.Ping(context.TODO(), nil)    // 查看连贯    err = client.Ping(context.TODO(), nil)    if err != nil {        log.Fatal(err)    }    fmt.Println("Connected to MongoDB!")}func find() {    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)    defer cancel()    collection := client.Database("go_db").Collection("student")    cur, err := collection.Find(ctx, bson.D{})    if err != nil {        log.Fatal(err)    }    defer cur.Close(ctx)    for cur.Next(ctx) {        var result bson.D        err := cur.Decode(&result)        if err != nil {            log.Fatal(err)        }        fmt.Printf("result: %v\n", result)        fmt.Printf("result.Map(): %v\n", result.Map()["name"])    }    if err := cur.Err(); err != nil {        log.Fatal(err)    }}func main() {    initDB()    find()}

更新文档

package mainimport (    "context"    "fmt"    "log"    "go.mongodb.org/mongo-driver/bson"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options")type Student struct {    Name string    Age  int}var client *mongo.Clientfunc initDb() {    co := options.Client().ApplyURI("mongodb://localhost:27017")    c, err := mongo.Connect(context.TODO(), co)    if err != nil {        log.Fatal(err)    }    err2 := c.Ping(context.TODO(), nil)    if err2 != nil {        log.Fatal(err2)    } else {        fmt.Println("连贯胜利!")    }    client = c}func update() {    ctx := context.TODO()    defer client.Disconnect(ctx)    c := client.Database("go_db").Collection("Student")    update := bson.D{{"$set", bson.D{{"Name", "big tom"}, {"Age", 22}}}}    ur, err := c.UpdateMany(ctx, bson.D{{"name", "tom"}}, update)    if err != nil {        log.Fatal(err)    }    fmt.Printf("ur.ModifiedCount: %v\n", ur.ModifiedCount)}func main() {    initDb()    update()}

删除文档

package mainimport (    "context"    "fmt"    "log"    "go.mongodb.org/mongo-driver/bson"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options")type Student struct {    Name string    Age  int}var client *mongo.Clientfunc initDb() {    co := options.Client().ApplyURI("mongodb://localhost:27017")    c, err := mongo.Connect(context.TODO(), co)    if err != nil {        log.Fatal(err)    }    err2 := c.Ping(context.TODO(), nil)    if err2 != nil {        log.Fatal(err2)    } else {        fmt.Println("连贯胜利!")    }    client = c}func del() {    initDb()    c := client.Database("go_db").Collection("Student")    ctx := context.TODO()    dr, err := c.DeleteMany(ctx, bson.D{{"Name", "big kite"}})    if err != nil {        log.Fatal(err)    }    fmt.Printf("ur.ModifiedCount: %v\n", dr.DeletedCount)}func main() {    del()}