原始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 }