• 基于golang官方mongo-driver操作总结


    有如下json格式字符串,需要使用golang-mongo-driver,操作入库。
    (该告警字符串来自WiseAPM告警中心)
    写入过程是,将json格式字符串转化为字节类型,使用bson提供的UnmarshalExtJSON方法,构造一个bson.D数据结构,就可以使用Insert系列方法写入mongodb.

    {
        "_id" : ObjectId("5fedf5c834879b193cc0a649"),
        "startTime" : NumberLong(1609430455),
        "alertList" : [ 
            {
                "setId" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b",
                "groupId" : "1",
                "time" : NumberLong(1609430455),
                "status" : "alert",
                "setName" : "[ARGUS]ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
                "alertLevel" : "2",
                "source" : "EMP-ALERT-ARGUS-INSTANCE",
                "text" : "[P3 #1/3] pg_cpu_used all(#2) 95.23148>90",
                "tags" : {
                    "alertDesc" : "pg_cpu_used",
                    "opcmObjType" : "Instance",
                    "note" : "",
                    "mail_s" : "",
                    "alertGrade" : "P3",
                    "OS" : "DB_POSTGRESQL_ADMIN",
                    "ip" : "",
                    "memo" : "",
                    "objName" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
                    "alertDepartment" : "",
                    "entity3" : "pg_cpu_used",
                    "mailFormatText" : "【告 警 状  态】告警
    【告 警 级  别】P3
    【告 警 对  象】ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw
    【告   警   IP】
    【监   控   项】pg_cpu_used
    【监控 项 描述】pg_cpu_used
    【标        签】
    【备        注】
    【表   达   式】all(#2) >90
    【接收 人 分组】
    【最大告警次数】3
    【当前告警次数】1
    【事件触发时间】2021-01-01 00:00:55 +0800 GMT-8
    ",
                    "entity1" : "0",
                    "maxAlertCount" : "3",
                    "mail_c" : "",
                    "opcmObjName" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
                    "currentAlertCount" : "1",
                    "linkUrl" : "",
                    "tag" : "",
                    "ukey" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b",
                    "objType" : "MiddleWare",
                    "alertDetailUrl" : "",
                    "environment" : "UNKNOW",
                    "status" : "UNKNOW"
                },
                "contact" : {},
                "tagSet" : [ 
                    {
                        "tagk" : "alertDesc",
                        "tagv" : "pg_cpu_used"
                    }, 
                    {
                        "tagk" : "note",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "mail_s",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "alertGrade",
                        "tagv" : "P3"
                    }, 
                    {
                        "tagk" : "OS",
                        "tagv" : "DB_POSTGRESQL_ADMIN"
                    }, 
                    {
                        "tagk" : "ip",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "memo",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "objName",
                        "tagv" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
                    }, 
                    {
                        "tagk" : "alertDepartment",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "entity3",
                        "tagv" : "pg_cpu_used"
                    }, 
                    {
                        "tagk" : "mailFormatText",
                        "tagv" : "【告 警 状  态】告警
    【告 警 级  别】P3
    【告 警 对  象】ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw
    【告   警   IP】
    【监   控   项】pg_cpu_used
    【监控 项 描述】pg_cpu_used
    【标        签】
    【备        注】
    【表   达   式】all(#2) >90
    【接收 人 分组】
    【最大告警次数】3
    【当前告警次数】1
    【事件触发时间】2021-01-01 00:00:55 +0800 GMT-8
    "
                    }, 
                    {
                        "tagk" : "entity1",
                        "tagv" : "0"
                    }, 
                    {
                        "tagk" : "maxAlertCount",
                        "tagv" : "3"
                    }, 
                    {
                        "tagk" : "mail_c",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "currentAlertCount",
                        "tagv" : "1"
                    }, 
                    {
                        "tagk" : "linkUrl",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "tag",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "ukey",
                        "tagv" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b"
                    }, 
                    {
                        "tagk" : "objType",
                        "tagv" : "MiddleWare"
                    }, 
                    {
                        "tagk" : "alertDetailUrl",
                        "tagv" : ""
                    }, 
                    {
                        "tagk" : "opcmObjName",
                        "tagv" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
                    }, 
                    {
                        "tagk" : "opcmObjType",
                        "tagv" : "Instance"
                    }, 
                    {
                        "tagk" : "name",
                        "tagv" : "[ARGUS]ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
                    }, 
                    {
                        "tagk" : "source",
                        "tagv" : "EMP-ALERT-ARGUS-INSTANCE"
                    }
                ],
                "alertIdSet" : [],
                "metric" : "pg_cpu_used",
                "lcd" : NumberLong(1609430456889),
                "frequency" : 0.0,
                "isCloseFlag" : "N",
                "anom" : 0.0,
                "step" : 0.0,
                "argusClsoeTime" : 0.0
            }
        ],
        "endTime" : NumberLong(1609430485),
        "preTime" : NumberLong(1606838455),
        "eventName" : "[ARGUS]ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
        "nextTime" : NumberLong(1612022455),
        "tags" : {
            "alertDesc" : "pg_cpu_used",
            "opcmObjType" : "Instance",
            "note" : "",
            "mail_s" : "",
            "alertGrade" : "P3",
            "OS" : "DB_POSTGRESQL_ADMIN",
            "ip" : "",
            "memo" : "",
            "objName" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
            "alertDepartment" : "",
            "entity3" : "pg_cpu_used",
            "mailFormatText" : "【告 警 状  态】告警
    【告 警 级  别】P3
    【告 警 对  象】ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw
    【告   警   IP】
    【监   控   项】pg_cpu_used
    【监控 项 描述】pg_cpu_used
    【标        签】
    【备        注】
    【表   达   式】all(#2) >90
    【接收 人 分组】
    【最大告警次数】3
    【当前告警次数】1
    【事件触发时间】2021-01-01 00:00:55 +0800 GMT-8
    ",
            "entity1" : "0",
            "maxAlertCount" : "3",
            "mail_c" : "",
            "opcmObjName" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
            "currentAlertCount" : "1",
            "linkUrl" : "",
            "tag" : "",
            "ukey" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b",
            "objType" : "MiddleWare",
            "alertDetailUrl" : "",
            "environment" : "UNKNOW",
            "status" : "UNKNOW"
        },
        "source" : "EMP-ALERT-ARGUS-INSTANCE",
        "toolSource" : null,
        "status" : "关闭",
        "objName" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw",
        "appName" : "",
        "serviceName" : "",
        "subsystemName" : "",
        "buName" : "",
        "group" : null,
        "text" : "[P3 #1/3] pg_cpu_used all(#2) 95.23148>90",
        "lcd" : NumberLong(1609430523522),
        "metric" : "pg_cpu_used",
        "step" : 0.0,
        "department" : "",
        "lastUpdateTime" : NumberLong(1609430523522),
        "lastMergeTime" : NumberLong(1609430472034),
        "mark" : false,
        "setId" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b_1",
        "tagSet" : [ 
            {
                "tagk" : "alertDesc",
                "tagv" : "pg_cpu_used"
            }, 
            {
                "tagk" : "note",
                "tagv" : ""
            }, 
            {
                "tagk" : "mail_s",
                "tagv" : ""
            }, 
            {
                "tagk" : "alertGrade",
                "tagv" : "P3"
            }, 
            {
                "tagk" : "OS",
                "tagv" : "DB_POSTGRESQL_ADMIN"
            }, 
            {
                "tagk" : "ip",
                "tagv" : ""
            }, 
            {
                "tagk" : "memo",
                "tagv" : ""
            }, 
            {
                "tagk" : "objName",
                "tagv" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
            }, 
            {
                "tagk" : "alertDepartment",
                "tagv" : ""
            }, 
            {
                "tagk" : "entity3",
                "tagv" : "pg_cpu_used"
            }, 
            {
                "tagk" : "mailFormatText",
                "tagv" : "【告 警 状  态】告警
    【告 警 级  别】P3
    【告 警 对  象】ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw
    【告   警   IP】
    【监   控   项】pg_cpu_used
    【监控 项 描述】pg_cpu_used
    【标        签】
    【备        注】
    【表   达   式】all(#2) >90
    【接收 人 分组】
    【最大告警次数】3
    【当前告警次数】1
    【事件触发时间】2021-01-01 00:00:55 +0800 GMT-8
    "
            }, 
            {
                "tagk" : "entity1",
                "tagv" : "0"
            }, 
            {
                "tagk" : "maxAlertCount",
                "tagv" : "3"
            }, 
            {
                "tagk" : "mail_c",
                "tagv" : ""
            }, 
            {
                "tagk" : "currentAlertCount",
                "tagv" : "1"
            }, 
            {
                "tagk" : "linkUrl",
                "tagv" : ""
            }, 
            {
                "tagk" : "tag",
                "tagv" : ""
            }, 
            {
                "tagk" : "ukey",
                "tagv" : "s_548807257_2972083_56e5d1e6c60d6d4404f83bc61f312c8b"
            }, 
            {
                "tagk" : "objType",
                "tagv" : "MiddleWare"
            }, 
            {
                "tagk" : "alertDetailUrl",
                "tagv" : ""
            }, 
            {
                "tagk" : "opcmObjName",
                "tagv" : "ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
            }, 
            {
                "tagk" : "opcmObjType",
                "tagv" : "Instance"
            }, 
            {
                "tagk" : "name",
                "tagv" : "[ARGUS]ac82b78a-24df-43b7-85c4-6d49b6d6ee98::[DB_PG]SHE_primary_6262_pg6799yw"
            }, 
            {
                "tagk" : "source",
                "tagv" : "EMP-ALERT-ARGUS-INSTANCE"
            }
        ],
        "level" : "2",
        "duration" : 30.0,
        "num" : 1.0,
        "createTime" : NumberLong(1609430472034),
        "isArgus" : 1.0,
        "alertInfo" : null,
        "configType" : null,
        "batchId" : null,
        "eventHandleTime" : 30.0
    }
    

    首先,初始化mongodb连接池的代码:

    common/mgo.go 
    package common
    import (
     "context"
     "fmt"
     "log"
     "go.mongodb.org/mongo-driver/mongo"
     "go.mongodb.org/mongo-driver/mongo/options"
    )
    type MongoDrivers struct {
     Client   *mongo.Client
     Database string
    }
    type MongoCfg struct {
     Host     string `yaml:"host"`
     Port     int    `yaml:"port"`
     Database string `yaml:"database"`
     User     string `yaml:"user"`
     Password string `yaml:"password"`
    }
    var mongoClient *mongo.Client
    var MgoDbName string
    func GetMongoClient() *mongo.Client {
     return mongoClient
    }
    func GetMongoDB() string {
     return MgoDbName
    }
    // 初始化
    func InitMongoDriver(m *MongoCfg) (err error) {
     //设置客户端参数
     //dsn := fmt.Sprintf("mongodb://%s:%s@%s:%d/%s", m.User, m.Password, m.Host, m.Port, m.Database)
     dsn := fmt.Sprintf("mongodb://%s:%d", m.Host, m.Port)
     clientOptions := options.Client().ApplyURI(dsn).
     SetAuth(options.Credential{
     AuthSource: m.Database,
     Username:   m.User,
     Password:   m.Password,
     })
     //连接到MongoDB
     mongoClient, err = mongo.Connect(context.TODO(), clientOptions)
     //defer client.Disconnect(context.TODO())
     if err != nil {
     log.Fatal(err)
     return
     }
     //检查链接
     err = mongoClient.Ping(context.TODO(), nil)
     if err != nil {
     log.Fatal(err)
     return
     }
     log.Println("[MongoDB] Connected to base MongoDB!")
     return
    }
    // 关闭
    func Close() {
     err := mongoClient.Disconnect(context.TODO())
     if err != nil {
     log.Fatal(err)
     }
     log.Println("Connection to MongoDB closed.")
    }
    

    下入过程:
    main.go:

    import (
     "go.mongodb.org/mongo-driver/bson"
     "go.mongodb.org/mongo-driver/mongo/options"
    )
    //mongoClient
    mongoClient := common.GetMongoClient()
    jsonBytes := []byte(jsonString)
    var insert_bson_d = bson.D{}
    err = bson.UnmarshalExtJSON(jsonBytes, true, &insert_bson_d)
    _, err = mongoClient.Database(from_mongodb).Collection(to_collection).InsertOne(context.Background(), insert_bson_d)
    

    同理,如果要将mongodb中复杂的数据结构,读出为json或map[string]interface{}格式,即可进行相反的操作过程(代码片段):

    mongoClient := common.GetMongoClient()
    findOptions := options.Find()
    
    findOptions.SetSort(bson.D{{"_id", 1}})
    filter := bson.D{{}}
    
    cur, err := mongoClient.Database(from_mongodb).Collection(from_collection).Find(context.Background(), filter, findOptions)
    var jsonMaps []map[string]interface{}
    for cur.Next(context.Background()) {
     var bsonDoc bson.D
     var tmpBytes []byte
     var jsonMap map[string]interface{}
     err = cur.Decode(&bsonDoc)
     if err != nil {
     log.Fatal(err)
     continue
     }
     tmpBytes, err = bson.MarshalExtJSON(bsonDoc, true, true)
     if err != nil {
     log.Fatal(err)
     continue
     }
     err = json.Unmarshal(tmpBytes, &jsonMap)
     if err != nil {
     log.Fatal(err)
     continue
     }
     jsonMaps = append(jsonMaps, jsonMap)
    }
    
  • 相关阅读:
    12.Docker网络类型
    博客迁移
    java注解
    IO多路复用技术(multiplexing)
    Java 中extends与implements使用方法
    初识autoconf
    初识swoole
    简单配置nginx使之支持pathinfo
    vue-cli 脚手架 安装过程
    PHP阻止页面后退如何用PHP实现禁用浏览器的后退,使后退的页面失效或链接到别的地方?使用php禁止浏览器缓存?
  • 原文地址:https://www.cnblogs.com/ralphdc/p/14359610.html
Copyright © 2020-2023  润新知