package main

import (
    "context"
    "fmt"
    "log"
    "time"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectToDB(uri, name string, timeout time.Duration, num uint64) (*mongo.Database, error) {
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()
    o := options.Client().ApplyURI(uri)
    o.SetMaxPoolSize(num)
    client, err := mongo.Connect(ctx, o)
    if err != nil {
        return nil, err
    }
    return client.Database(name), nil
}

func main()  {

    mgClient, err := ConnectToDB("mongodb://192.168.10.10:27017", "bigdata", 10, 100)
    if err != nil {
        //fmt.Println("链接失败")
        log.Print(err)
    }
    // 指定获取要操作的数据集
    collection := mgClient.Collection("bigdata")
    //fmt.Println(collection)


    type Student struct {
        Name string
        Age int
    }
    //接下来,创建一些Student类型的值,准备插入到数据库中:
    s1 := Student{"小红", 12}
    //插入文档
    //使用collection.InsertOne()方法插入一条文档记录:
    insertResult, err := collection.InsertOne(context.TODO(), s1)
    if err != nil {
        log.Print(err)
    }

    fmt.Println("Inserted a single document: ", insertResult.InsertedID)
    log.Println("Inserted a single document: ", insertResult.InsertedID)

    s2 := Student{"小兰", 10}
    s3 := Student{"小黄", 11}
    students := []interface{}{s2, s3}
    insertManyResult, err := collection.InsertMany(context.TODO(), students)
    if err != nil {
        log.Print(err)
    }
    fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
    log.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)


    filter := bson.D{{"name", "小兰"}}

    update := bson.D{
        {"$inc", bson.D{
            {"age", 1},
        }},
    }
    //接下来,就可以通过下面的语句找到小兰,给他增加一岁了:

    updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil {
        log.Print(err)
    }
    fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
    log.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)


    var result Student
    err = collection.FindOne(context.TODO(), filter).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Found a single document: %+v\n", result)

    // 查询多个
    // 将选项传递给Find()
    findOptions := options.Find()
    findOptions.SetLimit(2)

    // 定义一个切片用来存储查询结果
    var results []*Student

    // 把bson.D{{}}作为一个filter来匹配所有文档
    cur, err := collection.Find(context.TODO(), filter, 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)
    }

    fmt.Printf("Found all document: %+v\n", results)

    for k, v := range results{
        fmt.Printf("key:%v value:%v value type:%T\n", k, v, v)
    }


    // 删除名字是小黄的那个
    deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name","小黄"}})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult1.DeletedCount)
    // 删除所有
    deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult2.DeletedCount)
}
例子

相关文章:

  • 2022-01-29
  • 2022-03-09
  • 2021-12-11
  • 2021-08-08
  • 2021-11-11
猜你喜欢
  • 2021-12-22
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-05
  • 2021-09-30
相关资源
相似解决方案