func (conno *ConnoInfo) InsertConno() (interface{}, error) {

ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
collection_ex := beego.AppConfig.String("mongodb::mongodb_collection_ex")

conno.ID = primitive.NewObjectID()
//primitive.NewDateTimeFromTime(time.Now())

conno.Ts = date_utils.JsonTime(time.Now())

result, err := mongodb.Conn().Collection(fmt.Sprintf("%s%s", strings.ToLower(collection_ex), strings.ToLower(conno.Carriercd))).InsertOne(ctx, conno)

objectID := result.InsertedID.(primitive.ObjectID)

if err != nil {
return nil, err
}

return objectID.Hex(), nil

}

common.go

package date_utils

import (
"errors"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/bsontype"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
"time"
)

type JsonTime time.Time

const (
timeFormart = "2006-01-02 15:04:05"
)

func Now() JsonTime {
return JsonTime(time.Now())
}

//实现json反序列化,从传递的字符串中解析成时间对象
func (t *JsonTime) UnmarshalJSON(data []byte) (err error) {

if string(data) == "null" {
return nil
}

now, err := time.ParseInLocation(`"`+timeFormart+`"`, string(data), time.Local)
*t = JsonTime(now)
return
}

//实现json序列化,将时间转换成字符串byte数组
func (t JsonTime) MarshalJSON() ([]byte, error) {
b := make([]byte, 0, len(timeFormart)+2)
b = append(b, '"')
b = time.Time(t).AppendFormat(b, timeFormart)
b = append(b, '"')
return b, nil
}

//mongodb是存储bson格式,因此需要实现序列化bsonvalue(这里不能实现MarshalBSON,MarshalBSON是处理Document的),将时间转换成mongodb能识别的primitive.DateTime
func (t *JsonTime) MarshalBSONValue() (bsontype.Type, []byte, error) {
targetTime := primitive.NewDateTimeFromTime(time.Time(*t))
return bson.MarshalValue(targetTime)
}

//实现bson反序列化,从mongodb中读取数据转换成time.Time格式,这里用到了bsoncore中的方法读取数据转换成datetime然后再转换成time.Time
func (t *JsonTime) UnmarshalBSONValue(t2 bsontype.Type, data []byte) error {
v, _, valid := bsoncore.ReadValue(data, t2)
if valid == false {
return errors.New(fmt.Sprintf("%s, %s, %s", "读取数据失败:", t2, data))
}
*t = JsonTime(v.Time())
return nil
}
func (conno *ConnoInfo) GetConno(scac string) interface{} {

ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
//err := mongodb.Conn().FindOne(ctx, ConnoInfo{ID: conno.ID}).Decode(&conno)
filter := bson.D{{"_id", conno.ID}}
collection_ex := beego.AppConfig.String("mongodb::mongodb_collection_ex")

err := mongodb.Conn().Collection(fmt.Sprintf("%s%s", strings.ToLower(collection_ex), strings.ToLower(scac))).FindOne(ctx, filter).Decode(&conno)

if err != nil {
//return errors.NewInternalServerError(err.Error())
if ins := strings.Index(err.Error(), "no document"); ins > -1 {
return utils.Response{201, "nodata", err.Error()}
}
return utils.Response{500, "error", err.Error()}
}

return nil
}
type ConnoInfo struct {

ID primitive.ObjectID `json:"id" bson:"_id"`
Ts date_utils.JsonTime `json:"ts" bson:"ts"`

}