可以免费试用 MongoDB ,500MB 平时做测试没有问题啦,连接数据库可能因为网络有点慢,但是我们是测试啊,不在乎这点吧~

这是怎么申请试用版的博客,感谢这位大佬。注册好用起来很方便~ 传送门 https://www.cnblogs.com/xybaby/p/9460634.html

连接数据库选择的驱动是 mongo-go-driver , 传送门 https://github.com/mongodb/mongo-go-driver/tree/master/examples/documentation_examples

具体操作是这样的,在GOPATH,或者项目目录下。

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

如果用的是  Go Modules  引入后会爆红!所以我们需要 go mod tidy 。在国内你是知道的,所以我们这样。

powershell

$env:GOPROXY = "https://goproxy.io"

go mod tidy

然后下面是代码

建一个文件夹名字是 mgodb / mgo.go

package mgodb

import (
"context"
_"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
) type mgo struct {
uri string //数据库网络地址
database string //要连接的数据库
collection string //要连接的集合
} func (m *mgo)Connect() *mongo.Collection {
ctx , cancel :=context.WithTimeout(context.Background(),10*time.Second)
defer cancel() //养成良好的习惯,在调用WithTimeout之后defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI(m.uri))
if err != nil {
log.Print(err)
}
collection := client.Database(m.database).Collection(m.collection)
return collection
}

基本就是这样连接了,下面我们来测试耗时在哪。 在当前文件夹创建 mgodb / mgo_test.go  Goland会自动识别这是测试文件。代码

package mgodb

import (
"fmt"
"testing"
) func TestMgo_Connect(t *testing.T) {
var mgo = &mgo{
"mongodb+srv://user:password@官网给你的.mongodb.net",
"MainSite",
"UsersM12",
} mgo.Connect()
//collection :=mgo.Connect()
//fmt.Printf("%T\n",collection)
}

可以直接在 Goland 里执行,但是在控制台功能更多。

在这里我们需要用到 Graphviz 绘图软件 ,记得在环境变量配置一下。 传送门 : http://www.graphviz.org/

我们在命令行里执行测试文件

 go test -bench . -cpuprofile cpu.out

这样会生成可执行文件  mgodb.test.exe 和 cpu.out

 go tool pprof cpu.out

这时会有一个交互界面在里面输入 web

(pprof) web
(pprof) exit

就可以打开这张图片,svg 不能上传,大概可以看出连接花费了630ms

大概就是这样了,查询的语法都在 github那个传送门里,可以去看一下。

这是我现在使用的代码可以参考一下。

在 和 mgodb 文件夹下 建一个 initDB.go 文件

package models
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"time"
) type Database struct {
Mongo * mongo.Client
} var DB *Database //初始化
func Init() {
DB = &Database{
Mongo: SetConnect(),
}
}
// 连接设置
func SetConnect() *mongo.Client{
uri := "mongodb+srv://用户名:密码@官方给的.mongodb.net"
ctx ,cancel := context.WithTimeout(context.Background(),10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx,options.Client().ApplyURI(uri).SetMaxPoolSize(20)) // 连接池
if err !=nil{
fmt.Println(err)
}
return client
}

mgodb 里的 mgo.db 现在的代码是这样的 使用起来比较简单,删除和插入文档,只需要一个唯一匹配的键值对就可以了

package mgodb

import (
"blog/models"
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"strconv"
"time"
) type mgo struct {
database string
collection string
} func NewMgo(database, collection string) *mgo { return &mgo{
database,
collection,
}
} // 查询单个
func (m *mgo) FindOne(key string, value interface{}) *mongo.SingleResult {
client := models.DB.Mongo
collection, _ := client.Database(m.database).Collection(m.collection).Clone()
//collection.
filter := bson.D{{key, value}}
singleResult := collection.FindOne(context.TODO(), filter)
return singleResult
} //插入单个
func (m *mgo) InsertOne(value interface{}) *mongo.InsertOneResult {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
insertResult, err := collection.InsertOne(context.TODO(), value)
if err != nil {
fmt.Println(err)
}
return insertResult
} //查询集合里有多少数据
func (m *mgo) CollectionCount() (string, int64) {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
name := collection.Name()
size, _ := collection.EstimatedDocumentCount(context.TODO())
return name, size
} //按选项查询集合 Skip 跳过 Limit 读取数量 sort 1 ,-1 . 1 为最初时间读取 , -1 为最新时间读取
func (m *mgo) CollectionDocuments(Skip, Limit int64, sort int) *mongo.Cursor {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
SORT := bson.D{{"_id", sort}} //filter := bson.D{{key,value}}
filter := bson.D{{}}
findOptions := options.Find().SetSort(SORT).SetLimit(Limit).SetSkip(Skip)
//findOptions.SetLimit(i)
temp, _ := collection.Find(context.Background(), filter, findOptions)
return temp
} //获取集合创建时间和编号
func (m *mgo) ParsingId(result string) (time.Time, uint64) {
temp1 := result[:8]
timestamp, _ := strconv.ParseInt(temp1, 16, 64)
dateTime := time.Unix(timestamp, 0) //这是截获情报时间 时间格式 2019-04-24 09:23:39 +0800 CST
temp2 := result[18:]
count, _ := strconv.ParseUint(temp2, 16, 64) //截获情报的编号
return dateTime, count
} //删除文章和查询文章
func (m *mgo) DeleteAndFind(key string, value interface{}) (int64, *mongo.SingleResult) {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
filter := bson.D{{key, value}}
singleResult := collection.FindOne(context.TODO(), filter)
DeleteResult, err := collection.DeleteOne(context.TODO(), filter, nil)
if err != nil {
fmt.Println("删除时出现错误,你删不掉的~")
}
return DeleteResult.DeletedCount, singleResult
} //删除文章
func (m *mgo) Delete(key string, value interface{}) int64 {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
filter := bson.D{{key, value}}
count, err := collection.DeleteOne(context.TODO(), filter, nil)
if err != nil {
fmt.Println(err)
}
return count.DeletedCount } //删除多个
func (m *mgo) DeleteMany(key string, value interface{}) int64 {
client := models.DB.Mongo
collection := client.Database(m.database).Collection(m.collection)
filter := bson.D{{key, value}} count, err := collection.DeleteMany(context.TODO(), filter)
if err != nil {
fmt.Println(err)
}
return count.DeletedCount
}

应该知道怎么初始化吧

文件结构是这样的,models 在根目录下

package main

func main() {
models.Init() //初始化数据库
app := newApp()
routers.Router(app) // 页面访问
app.Run(iris.Addr(":3000")) // 火箭发射
}

Golang 连接 MongoDB使用连接池的更多相关文章

  1. golang mgo的mongo连接池设置:必须手动加上maxPoolSize

    本司礼物系统使用了golang的 mongo库 mgo,中间踩了一些坑,总结下避免大家再踩坑 golang的mgo库说明里是说明了开启连接复用的,但观察实验发现,这并没有根本实现连接的控制,连接复用仅 ...

  2. java操作mongodb(连接池)(转)

    原文链接: java操作mongodb(连接池) Mongo的实例其实就是一个数据库连接池,这个连接池里默认有10个链接.我们没有必要重新实现这个链接池,但是我们可以更改这个连接池的配置.因为Mong ...

  3. 在Spark中通过Scala + Mongodb实现连接池

    How to implement connection pool in spark https://github.com/YulinGUO/BigDataTips/blob/master/spark/ ...

  4. [转载]MongoDB 标准连接字符串

    MongoDB 标准连接字符串 mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[data ...

  5. Java程序中与MongoDB建立连接~小记

    1.Mongo和MongoClient的关系 MongoClient继承自Mongo,使用Mongo也可建立连接,但是需要使用与Mongo适应的MongoOptions,MongoURI等类型. 2. ...

  6. 使用mongo-java-driver-3.0.2连接MongoDB数据库

    这里使用的mongodb的java驱动版本是:3.0.2,文件名mongo-java-driver-3.0.2.jar  博客本地下载下载网址(也可以下载其它版本):http://central.ma ...

  7. node连接mongoDB篇

    一般介绍: 由于mongodb数据库在javascript脚本环境中支持bson对象(json对象的二进制形式)的存取,因此对于数据的存取的效率是非常高的.在mongodb数据库中,将每一条等待插入的 ...

  8. MongoDB的连接字符串

    本文导读:MongoDB数据库与传统的关系型数据库相比,它具有操作简单.完全免费.源码公开等特点,这使MongoDB产品广泛应用于各种大型门户网站和专业网站.由于MongoDB连接并不支持HTTP协议 ...

  9. 爬虫连接mongodb、多线程多进程的使用

    一.连接mongodb 1.            设置数据库 client=pymongo.MongoClient(‘localhost’) 2.            db=client[‘lag ...

随机推荐

  1. 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历   二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...

  2. Java-API-Package:javax.http.servlet

    ylbtech-Java-API-Package:javax.http.servlet 1.返回顶部 1. Package javax.servlet.http This chapter descri ...

  3. Python中try...except...else的用法

    Python中try...except...else的用法: try:    <语句>except <name>:    <语句>          #如果在try ...

  4. win 7命令行大全

    一.win+(X) 其中win不会不知道吧,X为代码! Win+L 锁定当前用户. Win+E 资源管理器. Win+R 运行. Win+G (Gadgets)顺序切换边栏小工具. Win+U    ...

  5. Android 4学习(7):用户界面 - 基础

    参考<Professional Android 4 Development> Android UI基本元素 下面这些概念是Android UI设计的基础,深入学习和理解它们是Android ...

  6. FTP 命令 上传下载

    ftp   ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer] 参数-v 禁止显示远程服务器响应.-n ...

  7. Codeforces #504(div1+div2) 1023D Array Restoration(线段树)

    题目大意:给你一个数组,数组是经过q次区间覆盖后的结果,第i次覆盖是把区间内的值赋值为i,其中有若干个地方数值未知(就是0),让你判断这个数组是否可以经过覆盖后得到的,如果可以,输出任意一种可行数组. ...

  8. 高并发压力测试工具Locust(蝗虫)

    What is Locust? Locust is an easy-to-use, distributed, user load testing tool. It is intended for lo ...

  9. php学习笔记-默认参数

    在定义函数的时候,我们可以把其中的一个参数变的特殊起来,使它有一个默认值,这个参数就叫默认参数.在调用这个函数的时候,你既可以给这个默认参数传递一个值,这样的话默认参数的值会被覆盖掉,也可以不给它传递 ...

  10. Luogu 4151 [WC2011]最大XOR和路径

    你谷又乱评分…… 首先发现答案只有可能是从$1$开始走到$n$,中间绕若干个环,然后使它取到的异或值最大. 这样子的话我们可以随便先取一条路径,强制选择走这条路径,然后把所有的环都丢进线性基里面去,因 ...