文章首发于:clawhub.club


最近再做一个小型邮件发送服务,需要用mongo记录一下邮件发送历史。虽说网上一大堆教程都是不建议用mongo官方的go版本,但是我还是用了,感觉简单的使用,因该碰不到啥坑吧。
github地址:
https://github.com/mongodb/mongo-go-driver
跟着示例就可以跑起来了,参考着官方文档,简单的封装了一下,以备使用。
官方文档地址:https://www.mongodb.com/blog/post/mongodb-go-driver-tutorial

上封装的原码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package gmongo

import (
"context"
"go-email/com/clawhub/pkg/logging"
"go-email/com/clawhub/pkg/setting"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
"time"
)

var Client *mongo.Client

type Mongo struct {
Uri string
TimeOut time.Duration
}

var MongoSetting = &Mongo{}

func Setup() {
//读取配置文件
setting.MapTo("mongo", MongoSetting)
var err error
//链接mongo服务
Client, err = mongo.Connect(GetContext(), options.Client().ApplyURI(MongoSetting.Uri))
if err != nil {
logging.AppLogger.Fatal("open mongodb fail")
}
//判断服务是否可用
err = Client.Ping(GetContext(), readpref.Primary())
if err != nil {
logging.AppLogger.Fatal("ping mongodb fail")
}
}

//公共参数
func GetContext() (ctx context.Context) {
ctx, _ = context.WithTimeout(context.Background(), MongoSetting.TimeOut)
return
}

配置文件

1
2
3
[mongo]
Uri = mongodb://username:password@192.168.0.188:27017
TimeOut=10s

这可能是最简单的封装了。
简单调用一下,在main中,调用

1
2
//mongo设置
gmongo.Setup()

之后系统启动时,自动加载mongo
插入一条数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type Mail struct {
Subject string
ToAddress string
ToName string
Body string
Time string
Res string
}

//发送邮件
func (m *Mail) Send() {
//处理模板
//发送邮件
//数据入mongo库
collection := gmongo.Client.Database("email").Collection("email")
_, err = collection.InsertOne(gmongo.GetContext(), m)
if err != nil {
logging.AppLogger.Error("insert mongo mail fail", zap.Error(err))
}
}

再说一下插入时间的问题,发现Go对时间的处理好像不是很强大,必须用time.Now().Format(“2006-01-02 15:04:05”) ,怪怪的。