原始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["pei*me"] = "$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["pei*me"] = "$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
}