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) }