這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
原始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"] = startTimematchConditionMap1["createtime"] = q_map}if endTime != "" {q_map2 := map[string]interface{}{}q_map2["$lte"] = endTimematchConditionMap1["createtime"] = q_map2}if projectname != "" {matchConditionMap1["detail.projectname"] = projectname}matchMap := map[string]interface{}{}matchMap["$match"] = matchConditionMap1unwindMap := 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" //電信公網IPqueryMap3["detail.detail.netReq"] = "569f76952ae6ff1d0043ed6f" //聯通公網IPqueryMap4["detail.detail.netReq"] = "569f82e62ae6ff1d0043ed72" //多線公網IPqueryMap5["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"] = queryArraymatchMap2 := map[string]interface{}{}matchMap2["$match"] = qMapgroupMap := 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"] = idMapgroupMap["tatalNum"] = sumMapmapGroup := map[string]interface{}{}mapGroup["$group"] = groupMapsortMap := map[string]interface{}{}sort1:=map[string]interface{}{}//sort1["tatalNum"] = 1//sort1["_id"] = 1sort1["_id.projectname"] = 1//sort1["_id.service"] = 1sort1["_id.peizhi"] = 1sortMap["$sort"] = sort1groupArr := 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.BaseMongoresultIn := 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_outunwindMap_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_outgroupMap_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_outgroupMap_out["tatalNum_out"] = sumMap_outmapGroup_out := map[string]interface{}{}mapGroup_out["$group"] = groupMap_outsortMap_out := map[string]interface{}{}sort2:=map[string]interface{}{}//sort2["_id"] = 1sort2["_id.projectname"] = 1//sort2["_id.service"] = 1sort2["_id.detail.template"] = 1sortMap_out["$sort"] = sort2groupArr_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.BaseMongoresultOut := 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 * inNumoutTotalMoney := price_float * outNumitem.(bson.M)["inTotalMoney"] = utils_r.Round(inTotalMoney,2)item.(bson.M)["outTotalMoney"] = utils_r.Round(outTotalMoney,2)item.(bson.M)["_id"].(bson.M)["jixingName"] = templateNameitem.(bson.M)["cost"] = price_float}//fmt.Println("發送組合結果-——————————>",resultIn)this.Data["resultIn"] = resultInthis.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}