package main import ( "context" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" "log" "time" ) // 數據結構體 type Test struct { Id string `bson:"_id"` Name string `bson:"name"` Level int `bson:"level"` } var db *mongo.Database // database 話柄 var collection *mongo.Collection // collection 話柄 //1、pool連接池模式 func ConnectToDB(uri, name string, timeout time.Duration) (*mongo.Database, error) { // 設置連接超時時間 ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() // 通過傳進來的uri連接相關的配置 o := options.Client().ApplyURI(uri) // 發起鏈接 client, err := mongo.Connect(ctx, o) if err != nil { log.Fatal(err) return nil, err } // 判斷服務是不是可用 if err = client.Ping(context.Background(), readpref.Primary()); err != nil { log.Fatal(err) return nil, err } // 返回 client return client.Database(name), nil } //2、新增一條數據 func AddOne(t *Test) { objId, err := collection.InsertOne(context.TODO(), &t) if err != nil { log.Println(err) return } log.Println("錄入數據成功,objId:", objId) } //3、刪除一條數據 func Del(m bson.M) { deleteResult, err := collection.DeleteOne(context.Background(), m) if err != nil { log.Fatal(err) } log.Println("collection.DeleteOne:", deleteResult) } //4、編輯一條數據 func EditOne(t *Test, m bson.M) { update := bson.M{"$set": t} updateResult, err := collection.UpdateOne(context.Background(), m, update) if err != nil { log.Fatal(err) } log.Println("collection.UpdateOne:", updateResult) } //5、更新數據 - 存在更新,不存在就新增 func Update(t *Test, m bson.M) { update := bson.M{"$set": t} updateOpts := options.Update().SetUpsert(true) updateResult, err := collection.UpdateOne(context.Background(), m, update, updateOpts) if err != nil { log.Fatal(err) } log.Println("collection.UpdateOne:", updateResult) } //6、模糊查詢 func Sectle(m bson.M) { cur, err := collection.Find(context.Background(), m) if err != nil { log.Fatal(err) } if err := cur.Err(); err != nil { log.Fatal(err) } for cur.Next(context.Background()) { var t Test if err = cur.Decode(&t); err != nil { log.Fatal(err) } log.Println("collection.Find name=primitive.Regex{xx}: ", t) } _ = cur.Close(context.Background()) } //7、准確搜索一條數據 func GetOne(m bson.M) { var one Test err := collection.FindOne(context.Background(), m).Decode(&one) if err != nil { log.Fatal(err) } log.Println("collection.FindOne: ", one) } //8、獲取多條數據 func GetList(m bson.M) { cur, err := collection.Find(context.Background(), m) if err != nil { log.Fatal(err) } if err := cur.Err(); err != nil { log.Fatal(err) } var all []*Test err = cur.All(context.Background(), &all) if err != nil { log.Fatal(err) } _ = cur.Close(context.Background()) log.Println("collection.Find curl.All: ", all) for _, one := range all { log.Println("Id:", one.Id, " - name:", one.Name, " - level:", one.Level) } } //9、統計collection的數據總數 func Count() { count, err := collection.CountDocuments(context.Background(), bson.D{}) if err != nil { log.Fatal(count) } log.Println("collection.CountDocuments:", count) } func main() { uri := "mongodb://admin:123456@10.168.4.61:27017/admin" name := "Test" maxTime := time.Duration(2) // 鏈接超時時間 table := "test" // 表名 db, err := ConnectToDB(uri, name, maxTime) if err != nil { panic("鏈接數據庫有誤!") } collection = db.Collection(table) t := Test{ Id: "1", Name: "zngw", Level: 55, } // 添加一條數據 AddOne(&t) // EditOne 編輯一條數據 t.Name = "guoke" EditOne(&t, bson.M{"_id": 1}) // 刪除一條數據 Del(bson.M{"_id": 1}) // 更新數據 - 存在更新,不存在就新增 Update(&t, bson.M{"_id": "1"}) // Sectle 模糊查詢 Sectle(bson.M{"name": primitive.Regex{Pattern: "guo"}}) // 准確搜索一條數據 GetOne(bson.M{"name": "guoke"}) // 統計collection的數據總數 Count() // GetList 獲取多條數據 GetList(bson.M{"level": 55}) }