分享
  1. 首页
  2. 文章

go语言mongdb管道使用

8899man · · 2924 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:8899man

查看原文:go语言mongdb管道使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2924 次点击
3 回复 | 直到 2000年01月01日 00:00:00
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏