package main import ( "strings" "sync" "log" "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/mongodb" ) var ( Mgo *mongodb.MongodbSim Mgos *mongodb.MongodbSim ) func init() { Mgo = mongodb.NewMgoWithUser("172.17.189.140:27080,172.17.189.141:27081", "bidding", "root", "top@123", 50) Mgos = mongodb.NewMgo("172.17.4.85:27080", "xzh", 50) } func main() { sess := Mgo.GetMgoConn() defer Mgo.DestoryMongoConn(sess) q := map[string]interface{}{} it := sess.DB("qfw").C("bidding").Find(&q).Sort("_id").Iter() pool := make(chan bool, 10) wg := &sync.WaitGroup{} total := 0 for tmp := make(map[string]interface{}); it.Next(&tmp); total++ { if total%1000 == 0 { log.Println("cur index ", total, tmp["_id"]) } pool <- true wg.Add(1) go func(tmp map[string]interface{}) { defer func() { <-pool wg.Done() }() // data := map[string]interface{}{} buyerclass := common.ObjToString(tmp["buyerclass"]) tag_subinformationMap := map[string]string{} buyerclassMap := map[string]string{} property_formMap := map[string]string{} if buyerclass != "" { buyerclassMap[buyerclass] = "1" } if tmp["tag_subinformation"] != nil { tag_subinformation := common.ObjArrToStringArr(tmp["tag_subinformation"].([]interface{})) for _, v := range tag_subinformation { tag_subinformationMap[v] = "1" } } if tmp["tag_subinformation_ai"] != nil { tag_subinformation_ai := common.ObjArrToStringArr(tmp["tag_subinformation_ai"].([]interface{})) for _, v := range tag_subinformation_ai { tag_subinformationMap[v] = "1" } } if tmp["property_form"] != nil { property_form := common.ObjArrToStringArr(tmp["property_form"].([]interface{})) for _, v := range property_form { property_formMap[v] = "1" } } buyer := common.ObjToString(tmp["buyer"]) agency := common.ObjToString(tmp["buyer"]) s_winner := common.ObjToString(tmp["s_winner"]) buyerclassMap1, tag_subinformationMap1, property_formMap1 := buyerclassMap, tag_subinformationMap, property_formMap tag_subinformationMap2, property_formMap2 := tag_subinformationMap, property_formMap getname(buyer, buyerclassMap1, tag_subinformationMap1, property_formMap1) getname1(agency, tag_subinformationMap2, property_formMap2) for _, v := range strings.Split(s_winner, ",") { tag_subinformationMap3, property_formMap3 := tag_subinformationMap, property_formMap getname1(v, tag_subinformationMap3, property_formMap3) } }(tmp) tmp = make(map[string]interface{}) } wg.Wait() log.Println("is over ~ ", total) } func getname(name string, buyerclassMap, tag_subinformationMap, property_formMap map[string]string) { if name != "" { data := map[string]interface{}{} bd, ok := Mgos.FindOne("label", map[string]interface{}{"name": name}) if ok && bd != nil && len(*bd) > 0 { if (*bd)["buyerclass"] != nil { if buyerclass1, oks := (*bd)["buyerclass"].(map[string]string); oks { for k, _ := range buyerclass1 { buyerclassMap[k] = "1" } } else if buyerclass1, oks := (*bd)["buyerclass"].(map[string]interface{}); oks { for k, _ := range buyerclass1 { buyerclassMap[k] = "1" } } } if (*bd)["tag_subinformation"] != nil { if tag_subinformation1, oks := (*bd)["tag_subinformation"].(map[string]string); oks { for k, _ := range tag_subinformation1 { tag_subinformationMap[k] = "1" } } else if tag_subinformation1, oks := (*bd)["tag_subinformation"].(map[string]interface{}); oks { for k, _ := range tag_subinformation1 { tag_subinformationMap[k] = "1" } } } if (*bd)["property_form"] != nil { if property_form1, oks := (*bd)["property_form"].(map[string]string); oks { for k, _ := range property_form1 { property_formMap[k] = "1" } } else if property_form1, oks := (*bd)["property_form"].(map[string]interface{}); oks { for k, _ := range property_form1 { property_formMap[k] = "1" } } } if len(buyerclassMap) > 0 { data["buyerclass"] = buyerclassMap } if len(tag_subinformationMap) > 0 { data["tag_subinformation"] = tag_subinformationMap } if len(property_formMap) > 0 { data["property_form"] = property_formMap } if len(data) > 0 { Mgos.Update("label", map[string]interface{}{"name": name}, map[string]interface{}{"$set": data}, false, false) } } else { data["name"] = name if len(buyerclassMap) > 0 { data["buyerclass"] = buyerclassMap } if len(tag_subinformationMap) > 0 { data["tag_subinformation"] = tag_subinformationMap } if len(property_formMap) > 0 { data["property_form"] = property_formMap } if len(data) > 0 { Mgos.Save("label", data) } } } } func getname1(name string, tag_subinformationMap, property_formMap map[string]string) { if name != "" { data := map[string]interface{}{} bd, ok := Mgos.FindOne("label", map[string]interface{}{"name": name}) if ok && bd != nil && len(*bd) > 0 { if (*bd)["tag_subinformation"] != nil { if tag_subinformation1, oks := (*bd)["tag_subinformation"].(map[string]string); oks { for k, _ := range tag_subinformation1 { tag_subinformationMap[k] = "1" } } else if tag_subinformation1, oks := (*bd)["tag_subinformation"].(map[string]interface{}); oks { for k, _ := range tag_subinformation1 { tag_subinformationMap[k] = "1" } } } if (*bd)["property_form"] != nil { if property_form1, oks := (*bd)["property_form"].(map[string]string); oks { for k, _ := range property_form1 { property_formMap[k] = "1" } } else if property_form1, oks := (*bd)["property_form"].(map[string]interface{}); oks { for k, _ := range property_form1 { property_formMap[k] = "1" } } } if len(tag_subinformationMap) > 0 { data["tag_subinformation"] = tag_subinformationMap } if len(property_formMap) > 0 { data["property_form"] = property_formMap } if len(data) > 0 { Mgos.Update("label", map[string]interface{}{"name": name}, map[string]interface{}{"$set": data}, false, false) } } else { data["name"] = name if len(tag_subinformationMap) > 0 { data["tag_subinformation"] = tag_subinformationMap } if len(property_formMap) > 0 { data["property_form"] = property_formMap } if len(data) > 0 { Mgos.Save("label", data) } } } }