zoukankan      html  css  js  c++  java
  • go语言mongdb管道使用

    原始json:

    {
      "listsn": "",
      "code": "fwq_add",
      "detail": {
        "appdate": "2016-06-28",
        "expectdate": "2016-06-30",
        "service_text": {
          "text": "NAT管理(乐视云计算有限公司产品研发中心_基础架构_网络服务_NAT管理)",
          "id": "343"
        },
        "projectname_text": {
          "id": "575789b9f0a2d7e179ac750b",
          "text": "采购项目"
        },
        "note": "test",
        "totalmoney": 132500,
        "detail": [
          {
            "buss": "",
            "alamLinks_text": [
              {
                "text": "张三1",
                "id": "zhangsan1@qq.com"
              }
            ],
            "opSystem_text": {
              "id": "CentOS 6.6",
              "text": "CentOS 6.6"
            },
            "buss_text": {
              "id": "",
              "text": ""
            },
            "template": "569f89b02ae6ff1d0043ed7b",
            "use_type_text": {
              "id": "1",
              "text": "生产环境"
            },
            "fpData": [],
            "follow_idc_text": {
              "id": "1",
              "text": "否"
            },
            "alamLinks": "zhangsan1@qq.com",
            "num": 2,
            "modular": "test",
            "follow_idc": "1",
            "netReq_text": {
              "text": "美国机房",
              "id": "569f9ae72ae6ff1d0043edc1"
            },
            "opSystem": "CentOS 6.6",
            "netReq": "569f9ae72ae6ff1d0043edc1",
            "use_type": "1",
            "template_text": {
              "id": "569f89b02ae6ff1d0043ed7b",
              "text": "A1-1  [CPU:24C(E5-2620V3*2)          内存:128G(16G*8)          硬盘:600G(系统 raid1)          ||标配实体机(普通应用)||26500 ]"
            }
          },
          {
            "buss_text": {
              "id": "",
              "text": ""
            },
            "num": 3,
            "use_type": "2",
            "follow_idc_text": {
              "id": "1",
              "text": "否"
            },
            "netReq": "568a7d67b9687e31c81d8379",
            "opSystem_text": {
              "id": "CentOS 6.6",
              "text": "CentOS 6.6"
            },
            "modular": "test2",
            "use_type_text": {
              "text": "测试环境",
              "id": "2"
            },
            "template": "569f89c32ae6ff1d0043ed7c",
            "alamLinks_text": [
              {
                "id": "zhangsan1@letv.com",
                "text": "张三1"
              }
            ],
            "follow_idc": "1",
            "alamLinks": "zhangsan1@letv.com",
            "opSystem": "CentOS 6.6",
            "buss": "",
            "template_text": {
              "id": "569f89c32ae6ff1d0043ed7c",
              "text": "A1-2  [CPU:24C(E5-2620V3*2)          内存:128G(16G*8)          硬盘:600G(系统 raid1),3T(数据 raid5)          ||标配实体机(普通应用)||26500 ]"
            },
            "netReq_text": {
              "id": "568a7d67b9687e31c81d8379",
              "text": "核心纯内网"
            },
            "fpData": []
          }
        ],
        "marate": "必要性说明test",
        "projectname": "575789b9f0a2d7e179ac750b",
        "service": "343",
        "explain": "必要性说明test",
        "purchase_type": "1",
        "purchase_type_text": {
          "id": "1",
          "text": "重点项目"
        }
      },
      "desc": "测试单据",
      "reader": "",
      "createtime": "2016-06-28 09:54:15",
      "type": "",
      "uuid": "cecaf698-a2d7-41fa-94b1-d157f38b3cfc",
      "status": 593,
      "updatetime": "2016-06-28 09:54:15",
      "orderid": 7437,
      "title": "测试单据",
      "owner": "zhangsan1@qq.com",
      "qq": "187287822",
      "leader": "李四 - ",
      "owner_name": "zhangsan1(zhangsan1@qq.com)",
      "telphone": "13718899792"
    }
    

      

    原始代码:

    /*
    	重点项目实体机需求汇总 查询数据
     */
    func (this *IndexController) ProjectReqTotalData() {
    
    
    fmt.Println("ddddddd-------------------->hhhhhhhh--------------------------->")
    
    	startTime := this.GetString("startTime")
    	endTime := this.GetString("endTime")
    	projectname := this.GetString("projectname")
    
    
    
    	/*
    db.process_list_info.aggregate(
    {"$match":{"status":551}},
    {"$unwind":"$detail.detail"},
    {"$group":
    	{"_id":{
    		"peizhi":"$detail.detail.template",
    		"projectname":"$detail.projectname_text.text",
    		"project":"$detail.projectname",
    		"service":"$detail.service",
    		"servicename":"$detail.service_text.text"
    		},
    		"tatalNum":{"$sum":"$detail.detail.num_int"}}},
    		{"$project":{"peizhi_id":"$_id.peizhi","netReq":"$_id.netReq","num":"$tatalNum"}})
     */
    
    
    	/*
    		国内部分
    	 */
    	matchConditionMap1 := map[string]interface{}{}
    	matchConditionMap1["detail.purchase_type_text.id"] = "1"
    	matchConditionMap1["code"] = "fwq_add"
    
    	neMap1 := map[string]interface{}{}
    	neMap1["status"] = int64(10)
    	neMap2 := map[string]interface{}{}
    	neMap2["status"] = int64(17)
    	matchConditionMap1["$nor"] = [2]interface{}{neMap1,neMap2}
    
    	//matchConditionMap1["status"] = int64(551)
    
    	if  startTime != "" {
    		q_map := map[string]interface{}{}
    		q_map["$gte"] = startTime
    		matchConditionMap1["createtime"] = q_map
    	}
    
    	if  endTime != "" {
    		q_map2 := map[string]interface{}{}
    		q_map2["$lte"] = endTime
    		matchConditionMap1["createtime"] = q_map2
    	}
    
    	if  projectname != "" {
    		matchConditionMap1["detail.projectname"] = projectname
    	}
    
    	matchMap := map[string]interface{}{}
    	matchMap["$match"] = matchConditionMap1
    
    	unwindMap := map[string]interface{}{}
    	unwindMap["$unwind"] = "$detail.detail"
    
    
    
    
    	//国内条件
    	queryMap1 := map[string]interface{}{}
    	queryMap2 := map[string]interface{}{}
    	queryMap3 := map[string]interface{}{}
    	queryMap4 := map[string]interface{}{}
    	queryMap5 := map[string]interface{}{}
    
    	queryMap1["detail.detail.netReq"] = "568a7d67b9687e31c81d8379"  //核心纯内网
    	queryMap2["detail.detail.netReq"] = "568a7dadb9687e31c81d8395"  //电信公网IP
    	queryMap3["detail.detail.netReq"] = "569f76952ae6ff1d0043ed6f"  //联通公网IP
    	queryMap4["detail.detail.netReq"] = "569f82e62ae6ff1d0043ed72"  //多线公网IP
    	queryMap5["detail.detail.netReq"] = "56c2f8102ae6ff1d004c2a8f"  //外地机房
    
    
    
    	queryArray := []interface{}{}
    	queryArray = append(queryArray,queryMap1)
    	queryArray = append(queryArray,queryMap2)
    	queryArray = append(queryArray,queryMap3)
    	queryArray = append(queryArray,queryMap4)
    	queryArray = append(queryArray,queryMap5)
    
    	qMap := map[string]interface{}{}
    	qMap["$or"] = queryArray
    
    	matchMap2 := map[string]interface{}{}
    	matchMap2["$match"] = qMap
    
    	groupMap := map[string]interface{}{}
    	idMap := map[string]interface{}{}
    	idMap["peizhi"] = "$detail.detail.template"
    	idMap["peizhiname"] = "$detail.detail.template_text.text"
    	idMap["projectname"] = "$detail.projectname_text.text"
    	idMap["project"] = "$detail.projectname"
    	//idMap["service"] = "$detail.service"
    	//idMap["servicename"] = "$detail.service_text.text"
    
    	sumMap := map[string]interface{}{}
    	sumMap["$sum"] = "$detail.detail.num"
    
    	groupMap["_id"] = idMap
    	groupMap["tatalNum"] = sumMap
    
    	mapGroup := map[string]interface{}{}
    	mapGroup["$group"] = groupMap
    
    	sortMap := map[string]interface{}{}
    	sort1:=map[string]interface{}{}
    	//sort1["tatalNum"] = 1
    	//sort1["_id"] = 1
    	sort1["_id.projectname"] = 1
    	//sort1["_id.service"] = 1
    	sort1["_id.peizhi"] = 1
    	sortMap["$sort"] = sort1
    
    	groupArr := make([]interface{}, 0)
    	groupArr = append(groupArr, matchMap)
    	groupArr = append(groupArr, unwindMap)
    	groupArr = append(groupArr, matchMap2)
    	groupArr = append(groupArr, mapGroup)
    	groupArr = append(groupArr, sortMap)
    
    
    	//fmt.Println("打印参数>>国内——————————————>",groupArr)
    	var baseMongo componets.BaseMongo
    	resultIn := baseMongo.FindPipe("lingshu", "process_list_info", groupArr)
    
    	//fmt.Println("打印结果>>国内------>")
    	//fmt.Println(resultIn)
    
    
    
    
    
    	/*
    		国外部分
    	 */
    	matchConditionMap1_out := map[string]interface{}{}
    	matchConditionMap1_out["detail.purchase_type_text.id"] = "1"
    	matchConditionMap1_out["code"] = "fwq_add"
    	//matchConditionMap1_out["status"] = int64(551)
    
    	matchMap_out := map[string]interface{}{}
    	matchMap_out["$match"] = matchConditionMap1_out
    
    	unwindMap_out := map[string]interface{}{}
    	unwindMap_out["$unwind"] = "$detail.detail"
    
    
    	qMap_out := map[string]interface{}{}
    	qMap_out["$nor"] = queryArray  // 国外条件
    	//matchConditionMap2["$detail.detail.netReq"] = "not in"  //国内条件
    	matchMap2_out := map[string]interface{}{}
    	matchMap2_out["$match"] = qMap_out
    
    	groupMap_out := map[string]interface{}{}
    	idMap_out := map[string]interface{}{}
    	idMap_out["peizhi"] = "$detail.detail.template"
    	idMap_out["peizhiname"] = "$detail.detail.template_text.text"
    	idMap_out["projectname"] = "$detail.projectname_text.text"
    	idMap_out["project"] = "$detail.projectname"
    	//idMap_out["service"] = "$detail.service"
    	//idMap_out["servicename"] = "$detail.service_text.text"
    
    	sumMap_out := map[string]interface{}{}
    	sumMap_out["$sum"] = "$detail.detail.num"
    
    	groupMap_out["_id"] = idMap_out
    	groupMap_out["tatalNum_out"] = sumMap_out
    
    	mapGroup_out := map[string]interface{}{}
    	mapGroup_out["$group"] = groupMap_out
    
    	sortMap_out := map[string]interface{}{}
    	sort2:=map[string]interface{}{}
    	//sort2["_id"] = 1
    	sort2["_id.projectname"] = 1
    	//sort2["_id.service"] = 1
    	sort2["_id.detail.template"] = 1
    	sortMap_out["$sort"] = sort2
    
    	groupArr_out := make([]interface{}, 0)
    	groupArr_out = append(groupArr_out, matchMap)
    	groupArr_out = append(groupArr_out, unwindMap_out)
    	groupArr_out = append(groupArr_out, matchMap2_out)
    	groupArr_out = append(groupArr_out, mapGroup_out)
    	groupArr_out = append(groupArr_out, sortMap_out)
    
    
    	//fmt.Println("打印参数>>国外——————————————>",groupArr_out)
    	var baseMongo_out componets.BaseMongo
    	resultOut := baseMongo_out.FindPipe("lingshu", "process_list_info", groupArr_out)
    
    	//fmt.Println("打印结果>>国外------>")
    	//fmt.Println(resultOut)
    
    
    
    
    	for _,v := range resultIn {
    
    		inMap := v.(bson.M)
    		v.(bson.M)["tatalNum_out"] = float64(0)
    		groupid := inMap["_id"].(bson.M)
    		for _, v_out := range resultOut {
    			outMap := v_out.(bson.M)
    			groupid_out := outMap["_id"].(bson.M)
    
    			if groupid_out["peizhi"].(string) == groupid["peizhi"].(string) && groupid_out["projectname"].(string) == groupid["projectname"].(string) && groupid_out["project"].(string) == groupid["project"].(string){
    				v.(bson.M)["tatalNum_out"] = outMap["tatalNum_out"]
    				v_out.(bson.M)["is_merge"] = "1"
    			}
    		}
    
    	}
    
    
    	//fmt.Println("打印out处理后数据——————————>",resultOut)
    
    	for _,m := range resultOut {
    		if m.(bson.M)["is_merge"]==nil{
    
    			m.(bson.M)["tatalNum"] = float64(0)
    			resultIn = append(resultIn,m)
    
    		}
    
    
    	}
    
    	utils_r := componets.Utils{}
    
    	for _, item := range resultIn {
    		template_id := item.(bson.M)["_id"].(bson.M)["peizhi"].(string)
    		objectid := bson.ObjectIdHex(template_id)
    
    		itemRes := baseMongo.FindById("lingshu", "cmdb_store_dict",objectid)
    
    		fmt.Println("打印模版信息————————>",itemRes)
    		templateName := itemRes.(bson.M)["templateName"]
    		cost := itemRes.(bson.M)["cost"]
    		price := "0"
    		if cost!=nil {
    			price = cost.(string)
    			if price=="" {
    				price ="0"
    			}
    		}
    
    		inNum := float64(0)
    		outNum := float64(0)
    
    		if(reflect.TypeOf(item.(bson.M)["tatalNum"]).Name()=="int"){
    			inNum = float64(item.(bson.M)["tatalNum"].(int))
    		}else {
    			inNum = item.(bson.M)["tatalNum"].(float64)
    		}
    
    
    		if(reflect.TypeOf(item.(bson.M)["tatalNum_out"]).Name()=="int"){
    			outNum = float64(item.(bson.M)["tatalNum_out"].(int))
    		}else {
    			outNum = item.(bson.M)["tatalNum_out"].(float64)
    		}
    
    
    
    		tempprice,_ := strconv.ParseFloat(price,64)
    		price_float := utils_r.Round(tempprice,2)
    
    		inTotalMoney := price_float * inNum
    		outTotalMoney := price_float * outNum
    
    		item.(bson.M)["inTotalMoney"] = utils_r.Round(inTotalMoney,2)
    		item.(bson.M)["outTotalMoney"] = utils_r.Round(outTotalMoney,2)
    
    		item.(bson.M)["_id"].(bson.M)["jixingName"] = templateName
    		item.(bson.M)["cost"] = price_float
    	}
    
    	//fmt.Println("发送组合结果-——————————>",resultIn)
    
    
    	this.Data["resultIn"] = resultIn
    
    
    
    	this.Data["Baseurl"]=beego.AppConfig.String("baseurl")
    
    	this.TplNames = "statistics/projectreqtotaldata.html"
    }
    

    mongdb原始命令:

    b.process_list_info.aggregate(
    {"$match":{"status":551}},
    {"$unwind":"$detail.detail"},
    {"$group":
    	{"_id":{
    		"peizhi":"$detail.detail.template",
    		"projectname":"$detail.projectname_text.text",
    		"project":"$detail.projectname",
    		"service":"$detail.service",
    		"servicename":"$detail.service_text.text"
    		},
    		"tatalNum":{"$sum":"$detail.detail.num_int"}}},
    		{"$project":{"peizhi_id":"$_id.peizhi","netReq":"$_id.netReq","num":"$tatalNum"}})
    
    
    
    
    
    db.process_list_info.aggregate({"$unwind":"$detail.detail”})
    
    db.process_list_info.aggregate({"$match":{"detail.projectname_text.id":"575789b9f0a2d7e179ac750b"}},{"$unwind":"$detail.detail”})
    
    db.process_list_info.aggregate({"$match":{"detail.projectname_text.id":"575789b9f0a2d7e179ac750b"}},{"$unwind":"$detail.detail"},{"$project":{"tttt":"$createtime"}})
    
    
    db.process_list_info.aggregate({"$match":{"detail.projectname_text.id":"575789b9f0a2d7e179ac750b","orderid":8285}},{"$unwind":"$detail.detail"},{"$group":{"_id":"$detail.detail.template","tatalNum":{"$sum":"$detail.detail.num"}}},{"$project":{"peizhi_id":"$_id","num":"$tatalNum"}})
    
    
    db.process_list_info.aggregate({"$match":{"status":551}},{"$unwind":"$detail.detail"},{"$group":{"_id":{"peizhi":"$detail.detail.template","netReq":"$detail.detail.netReq"},"tatalNum":{"$sum":"$detail.detail.num_int"}}},{"$project":{"peizhi_id":"$_id.peizhi","netReq":"$_id.netReq","num":"$tatalNum"}})
    
    
    
     db.process_list_info.aggregate({"$match":{"status":551}},{"$unwind":"$detail.detail"},{"$group":{"_id":{"peizhi":"$detail.detail.template","projectname":"$detail.projectname_text.text","project":"$detail.projectname","service":"$detail.service","servicename":"$detail.service_text.text"},"tatalNum":{"$sum":"$detail.detail.num_int"}}},{"$project":{"peizhi_id":"$_id.peizhi","netReq":"$_id.netReq","num":"$tatalNum"}})




     

     

      

    注意:不管是mongdb原始命令,还是go调用,$sum操作符号,只能汇总数值类型的字段(比如,Double,float等);之前保存的时候num字段保存为string类型(“5”),无法汇总;
    
    
    db.process_list_info.find({"code":"fwq_add"}).forEach(function(obj){obj.detail.detail.forEach(function(bj){ bj.num = parseFloat(bj.num) } );db.process_list_info.save(obj)  })
    
    db.process_list_info.find({"code":"fwq_mv_add"}).forEach(function(obj){obj.detail.detail.forEach(function(bj){ bj.num = parseFloat(bj.num) } );db.process_list_info.save(obj)  })
    
    这样处理以后num字段转换成了Double;
    
     
    
    db.foo.find({bad: {$exists: true}}).forEach(function(obj) { 
    obj.user_id = new NumberInt(obj.user_id);
    db.foo.save(obj);
    });
    

      

    go的管道调用

    func (this *BaseMongo) FindPipe(dataBase string, col string, queryStruct []interface{}) []interface{} {
    	if session.Ping() != nil {
    		doConn()
    	}
    	c := session.DB(dataBase).C(col)
    	var result []interface{}
    	c.Pipe(&queryStruct).All(&result)
    	return result
    }
    

      

      

  • 相关阅读:
    根据数据类型选择特征 select_dtypes(include=[]/exclude=[])
    quantile()
    concat()、merge()的区别
    json.dumps()和json.loads()
    Linux-top命令详解
    性能测试总结(一)---基础理论篇
    jmeter-常见问题及解决方法
    Jmeter之Bean shell使用(五)
    Jmeter-内存溢出原因及解决方法
    JMeter- JDBC Request
  • 原文地址:https://www.cnblogs.com/8899man/p/5622443.html
Copyright © 2011-2022 走看看