Переглянути джерело

新增企业类型字段...

zhengkun 1 рік тому
батько
коміт
954f245a6e

+ 6 - 3
fieldproject_medical/data_subject/src/main.go

@@ -6,20 +6,23 @@ import (
 	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
 	"subject"
+	"subject_test"
 	"subject_udp"
 	su "subject_util"
 )
 
 func init() {
-	//su.IsLocal = true
-	//su.IsDev = true
+	su.IsLocal = true
+	su.IsDev = true
 	su.InitClass()
 	subject_udp.InitUdpMsg()
 	log.Debug("~~~~准备完毕~~~~")
 }
 
 func main() {
-	log.Debug("main ...")
+	//全量修全部...临时测试环境先修100条...
+	go subject_test.TestEnterpriseTypeFullInfo()
+
 	lock := make(chan bool)
 	<-lock
 }

+ 3 - 0
fieldproject_medical/data_subject/src/subject/subject_add.go

@@ -128,6 +128,7 @@ func dealWithUpdateContact(name string, buyerclass string, contact *Contact, ide
 		isLast = true
 	}
 	if info == nil {
+
 	} else { //判断企业库最新的company_id是否与当前保持一致
 		qyxy_info := CreateQyxyInfo(name)
 		if len(qyxy_info) > 0 {
@@ -153,6 +154,7 @@ func dealWithUpdateContact(name string, buyerclass string, contact *Contact, ide
 		base_info["name_id"] = name_id
 		base_info["identity_type"] = qu.IntAll(Str2DEC(identity))
 		base_info["createtime"] = time.Unix(time.Now().Unix(), 0).Format(ul.TimeLayout)
+		base_info["enterprise_type"] = su.GetCenterEnTypeValue(qyxy_info, name) //新增字段...
 		if isLast && contact.Publishtime > 0 {
 			base_info["latest_time"] = time.Unix(contact.Publishtime, 0).Format(ul.TimeLayout)
 		}
@@ -371,6 +373,7 @@ func CreateQyxyInfo(name string) map[string]interface{} {
 		"legal_person":     1,
 		"company_phone":    1,
 		"company_email":    1,
+		"company_type_old": 1,
 	})
 	if len(dataArr) > 0 {
 		qyxy_info = dataArr[0] //补充企业信息

+ 41 - 0
fieldproject_medical/data_subject/src/subject_test/test.go

@@ -3,6 +3,7 @@ package subject_test
 import (
 	"fmt"
 	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson"
 	qu "qfw/util"
 	"subject"
 	su "subject_util"
@@ -42,3 +43,43 @@ L:
 	}
 	log.Debug("is over ", total)
 }
+
+func TestEnterpriseTypeFullInfo() {
+	log.Debug("开始修...")
+	index, total := 0, 0
+L:
+	for {
+		dataArr := su.MysqlGlobalTool.Find("dws_f_ent_baseinfo", nil, "id,name,company_id", "id", index*10000, 10000)
+		if dataArr != nil {
+			if len(*dataArr) == 0 {
+				break
+			}
+			for _, v := range *dataArr {
+				id := qu.IntAll(v["id"])
+				if id >= 1000 {
+					break L
+				}
+				name := qu.ObjToString(v["name"])
+				company_id := qu.ObjToString(v["company_id"])
+				qy_info := su.QyxyMgo.FindByStrId("qyxy_std", company_id, bson.M{"company_type_old": 1})
+				if qy_info == nil {
+					qy_info = map[string]interface{}{}
+				}
+				enterprise_type := su.GetCenterEnTypeValue(qy_info, name)
+				if enterprise_type != "" && id > 0 {
+					su.MysqlGlobalTool.Update("dws_f_ent_baseinfo", map[string]interface{}{"id": id}, map[string]interface{}{"enterprise_type": enterprise_type})
+				}
+			}
+		} else {
+			break L
+		}
+		index++
+		total += len(*dataArr)
+		subject.SeoUnique = map[string]string{}
+		subject.SeoSId = fmt.Sprintf("%d", qu.IntAll(subject.SeoSId)+135790)
+		if total%10000 == 0 {
+			log.Debug("cur index ", index, "~", total)
+		}
+	}
+	log.Debug("is over ", total)
+}

+ 126 - 0
fieldproject_medical/data_subject/src/subject_util/entype.go

@@ -0,0 +1,126 @@
+package subject_util
+
+import (
+	qu "qfw/util"
+	"strconv"
+	"strings"
+)
+
+var typeMap = map[string]string{
+	"有限责任公司(国有独资)": "国企", "有限责任公司(外商投资企业投资)": "外企", "有限责任公司(外商投资企业合资)": "外企", "有限责任公司(外商投资企业与内资合资)": "外企",
+	"有限责任公司(外商投资企业法人独资)": "外企", "有限责任公司(自然人投资或控股)": "民企", "有限责任公司(国有控股)": "国企", "一人有限责任公司": "民企",
+	"有限责任公司(自然人独资)": "民企", "有限责任公司(自然人投资或控股的法人独资)": "民企", "有限责任公司(非自然人投资或控股的法人独资)": "民企",
+	"股份有限公司(上市、外商投资企业投资)": "外企", "股份有限公司(上市、自然人投资或控股)": "民企", "股份有限公司(上市、国有控股)": "国企", "其他股份有限公司(上市)": "民企",
+	"股份有限公司(非上市、外商投资企业投资)": "外企", "股份有限公司(非上市、自然人投资或控股)": "民企", "股份有限公司(非上市、国有控股)": "国企",
+	"有限责任公司分公司(国有独资)": "国企", "有限责任公司分公司(外商投资企业投资)": "外企", "有限责任公司分公司(外商投资企业合资)": "外企",
+	"有限责任公司分公司(外商投资企业与内资合资)": "外企", "有限责任公司分公司(外商投资企业法人独资)": "外企", "有限责任公司分公司(自然人投资或控股)": "民企",
+	"有限责任公司分公司(国有控股)": "国企", "一人有限责任公司分公司": "民企", "有限责任公司分公司(自然人独资)": "民企", "有限责任公司分公司(自然人投资或控股的法人独资)": "民企",
+	"有限责任公司分公司(非自然人投资或控股的法人独资)": "民企", "股份有限公司分公司(上市、外商投资企业投资)": "外企", "股份有限公司分公司(上市、自然人投资或控股)": "民企",
+	"股份有限公司分公司(上市、国有控股)": "国企", "其他股份有限公司分公司(上市)": "民企", "股份有限公司分公司(非上市、外商投资企业投资)": "外企",
+	"股份有限公司分公司(非上市、自然人投资或控股)": "民企", "股份有限公司分公司(国有控股)": "国企", "内资企业法人": "民企", "全民所有制": "国企", "集体所有制": "集体",
+	"股份制": "民企", "股份合作制": "民企", "事业单位营业": "事业单位", "国有事业单位营业": "事业单位", "集体事业单位营业": "事业单位", "社团法人营业": "社团",
+	"国有社团法人营业": "社团", "集体社团法人营业": "社团", "全民所有制分支机构(非法人)": "国企", "集体分支机构(非法人)": "集体", "股份制分支机构": "民企",
+	"股份合作制分支机构": "民企", "国有经营单位(非法人)": "国企", "集体经营单位(非法人)": "集体", "非公司私营企业": "民企", "合伙企业": "民企", "普通合伙企业": "民企",
+	"特殊普通合伙企业": "民企", "有限合伙企业": "民企", "个人独资企业": "民企", "合伙企业分支机构": "民企", "普通合伙企业分支机构": "民企",
+	"特殊普通合伙企业分支机构": "民企", "有限合伙企业分支机构": "民企", "个人独资企业分支机构": "民企", "股份制企业(非法人)": "民企", "外商投资企业": "外企",
+	"有限责任公司(中外合资)": "外企", "有限责任公司(中外合作)": "外企", "有限责任公司(外商合资)": "外企", "有限责任公司(外国自然人独资)": "外企",
+	"有限责任公司(外国法人独资)": "外企", "有限责任公司(外国非法人经济组织独资)": "外企", "股份有限公司(中外合资、未上市)": "外企", "股份有限公司(中外合资、上市)": "外企",
+	"股份有限公司(外商合资、未上市)": "外企", "股份有限公司(外商合资、上市)": "外企", "非公司外商投资企业(中外合作)": "外企", "外商投资合伙企业": "外企",
+	"外商投资企业分支机构": "外企", "非公司外商投资企业分支机构": "外企", "外商投资合伙企业分支机构": "外企", "港、澳、台投资企业": "港澳台企",
+	"有限责任公司(港澳台与境内合资)": "港澳台企", "有限责任公司(港澳台与境内合作)": "港澳台企", "有限责任公司(港澳台合资)": "港澳台企",
+	"有限责任公司(港澳台自然人独资)": "港澳台企", "有限责任公司(港澳台法人独资)": "港澳台企", "有限责任公司(港澳台非法人经济组织独资)": "港澳台企",
+	"有限责任公司(港澳台与外国投资者合资)": "港澳台企", "股份有限公司(港澳台与境内合资、未上市)": "港澳台企", "股份有限公司(港澳台与境内合资、上市)": "港澳台企",
+	"股份有限公司(港澳台合资、未上市)": "港澳台企", "股份有限公司(港澳台合资、上市)": "港澳台企", "股份有限公司(港澳台与外国投资者合资、未上市)": "港澳台企",
+	"股份有限公司(港澳台与外国投资者合资、上市)": "港澳台企", "非公司港、澳、台企业(港澳台与境内合作)": "港澳台企", "非公司港、澳、台企业(港澳台合资)": "港澳台企",
+	"港、澳、台投资合伙企业": "港澳台企", "港、澳、台投资企业分支机构": "港澳台企", "非公司港、澳、台投资企业分支机构": "港澳台企", "港、澳、台投资合伙企业分支机构": "港澳台企",
+	"外国(地区)企业": "外企", "外国(地区)公司分支机构": "外企", "外国(地区)无限责任公司分支机构": "外企", "外国(地区)有限责任公司分支机构": "外企",
+	"外国(地区)股份有限责任公司分支机构": "外企", "外国(地区)其他形式公司分支机构": "外企", "外国(地区)企业常驻代表机构": "外企", "外国(地区)企业在中国境内从事经营活动": "外企",
+	"农民专业合作社": "农民合作社", "农民专业合作社分支机构": "农民合作社", "个体工商户": "个体工商户", "有限责任公司": "民企", "民办非企业单位": "民办非企业单位",
+	"社会团体": "社团", "律师事务所": "律师事务所", "分公司": "民企", "事业单位": "事业单位", "有限责任公司(自然人独资)(1151)": "民企",
+	"有限责任公司(自然人投资或控股)(1130)": "民企", "村级集体经济组织": "集体", "外商投资企业分公司": "外企", "有限责任公司(港澳台投资、非独资)": "港澳台企",
+	"有限责任公司(外商投资、非独资)": "外企", "股份有限公司": "民企", "集体所有制(股份合作)": "集体", "有限责任公司(台港澳与境内合资)": "港澳台企",
+	"有限责任公司(非自然人投资或控股的法人独": "民企", "有限责任公司(台港澳法人独资)": "港澳台企", "有限责任公司(非自然人投资或控股的法人独资)(1153)": "民企",
+	"集体企业": "集体", "企业": "民企", "私营有限责任公司(自然人控股或私营性质企业控股)": "民企", "有限责任公司(台港澳合资)": "港澳台企",
+	"有限责任公司(自然人投资或控股的法人独资)(1152)": "民企", "股份有限公司(外商投资、未上市)": "外企", "基金会": "其他", "内资企业集团": "民企",
+	"普通合伙企业(4531)": "民企", "有限责任公司(法人独资,私营)": "民企", "有限责任公司(台港澳自然人独资)": "港澳台企", "有限责任公司(自然人独资)!": "民企",
+	"(普通合伙分支机构)": "民企", "承包工程": "其他", "非公司企业法人(股份合作制)": "民企", "非公司企业法人(集体经济)": "集体", "非公司企业法人分支机构(集体经济)": "集体",
+	"个人经营": "个体工商户", "股份有限公司(港澳台投资、上市)": "港澳台企", "股份有限公司(港澳台投资、未上市)": "港澳台企", "股份有限公司(台港澳与境内合资、上市)": "港澳台企",
+	"股份有限公司(外商投资、未上市)分公司": "外企", "股份有限公司(中外合资、未上市)分公司": "外企", "股份有限公司分公司(非上市、国有控股)": "国企", "国有企业": "国企",
+	"国有企业经营单位(非法人)": "国企", "合伙企业(普通合伙)": "民企", "合伙企业(有限合伙)": "民企", "集体所有制(股份合作)分支机构": "集体",
+	"集体所有制(股份合作)-全资设立": "集体", "联营": "其他", "内资非法人企业、非公司私营企业": "民企", "内资非法人企业、非公司私营企业及内资非公司企业分支机构": "民企",
+	"内资集团": "民企", "其他": "其他", "其他有限责任公司(1190)": "民企", "台、港、澳投资企业分公司": "港澳台企", "台、港、澳投资企业分支机构": "港澳台企",
+	"台港澳分公司": "港澳台企", "未规范的有限责任公司": "民企", "一人有限责任公司(法人独资)": "民企", "一人有限责任公司(自然人独资)": "民企",
+	"有限责任公司(台港澳与外国投资者合资)": "外企", "有限责任公司(中外合资)分公司": "外企", "有限责任公司(中外合资)分支机构": "外企", "有限责任公司分公司(法人独资)": "民企",
+	"有限责任公司分公司(自然人投资或控股)!": "民企", "组级集体经济组织": "集体", "农民专业合作经济组织": "农民合作社", "农民专业合作社(9100)": "农民合作社",
+	"股份有限公司(外商投资、上市)": "外企",
+}
+var typeOtherMap = map[string][]string{
+	"内资公司": []string{"国企", "民企"}, "其他有限责任公司": []string{"国企", "民企"}, "股份有限公司(上市)": []string{"国企", "民企"},
+	"股份有限公司(非上市)": []string{"国企", "民企"}, "其他股份有限公司(非上市)": []string{"国企", "民企"}, "内资分公司": []string{"国企", "民企"},
+	"有限责任公司分公司": []string{"国企", "民企"}, "其他有限责任公司分公司": []string{"国企", "民企"}, "股份有限公司分公司": []string{"国企", "民企"},
+	"股份有限公司分公司(上市)": []string{"国企", "民企"}, "股份有限公司分公司(非上市)": []string{"国企", "民企"}, "其他股份有限公司分公司(非上市)": []string{"国企", "民企"},
+	"内资非法人企业、非公司私营企业及内资非公司企业分支机构": []string{"国企", "其他"}, "内资企业法人分支机构(非法人)": []string{"国企", "其他"},
+	"经营单位(非法人)": []string{"国企", "其他"}, "集团": []string{"国企", "民企"}, "有限责任公司(法人独资)": []string{"国企", "民企"},
+	"有限责任公司(法人独资)": []string{"国企", "民企"}, "有限责任公司分公司(法人独资)": []string{"国企", "民企"},
+}
+var keyOtherArr = []string{"中国", "国家", "中建", "中电科", "中航", "中铁", "中核", "中船", "中石油", "中石化", "东风汽车", "鞍钢", "中铝", "中粮", "中储粮", "五矿",
+	"招商局", "华润", "中煤", "中盐", "矿冶科技", "中车", "中农发", "中林", "新兴际华", "中广核", "华侨城", "南光", "中远洋"}
+
+// 主要采用mgo库的数据进行校验,以及企业名字
+func GetCenterEnTypeValue(entData map[string]interface{}, companyName string) string {
+	companyTypeOld := qu.ObjToString(entData["company_type_old"])
+	typeNew := ""
+	if companyTypeOld != "" {
+		companyTypeOld = strings.ReplaceAll(companyTypeOld, "(", "(")
+		companyTypeOld = strings.ReplaceAll(companyTypeOld, ")", ")")
+		if len(companyTypeOld) >= 6 && isDigits(companyTypeOld[len(companyTypeOld)-5:len(companyTypeOld)-1]) {
+			companyTypeOld = companyTypeOld[:len(companyTypeOld)-6]
+		}
+		if typeMap[companyTypeOld] != "" {
+			typeNew = typeMap[companyTypeOld]
+		} else if typeOtherMap[companyTypeOld] != nil {
+			for _, key := range keyOtherArr {
+				isOk := false
+				if strings.HasPrefix(companyName, key) {
+					isOk = true
+				}
+				if isOk {
+					typeNew = typeOtherMap[companyTypeOld][0]
+				} else {
+					typeNew = typeOtherMap[companyTypeOld][1]
+				}
+			}
+		} else {
+			// 港澳台顺序不一致,单独判断,如果同时包含港澳台的就是“港澳台企”
+			// 若名称最后一个字为“店”,则标注为“个体工商户”;若名称结尾为“公司”,则标注为“民企”;其余标注为“其他”
+			if strings.Contains(companyTypeOld, "港") && strings.Contains(companyTypeOld, "澳") && strings.Contains(companyTypeOld, "台") {
+				typeNew = "港澳台企"
+			} else if strings.HasSuffix(companyName, "店") {
+				typeNew = "个体工商户"
+			} else if strings.HasSuffix(companyName, "公司") || strings.HasSuffix(companyName, "集团") {
+				typeNew = "民企"
+			} else {
+				typeNew = "其他"
+			}
+		}
+	} else {
+		// (类型为空的,若名称最后一个字为“店”,则标注为“个体工商户”;若名称结尾为“公司”,则标注为“民企”;其余标注为“其他”。
+		if strings.HasSuffix(companyName, "店") {
+			typeNew = "个体工商户"
+		} else if strings.HasSuffix(companyName, "公司") || strings.HasSuffix(companyName, "集团") {
+			typeNew = "民企"
+		} else {
+			typeNew = "其他"
+		}
+	}
+	if typeNew == "" {
+		typeNew = "其他"
+	}
+	return typeNew
+}
+
+// 判断字符串是否全部由数字组成
+func isDigits(str string) bool {
+	_, err := strconv.Atoi(str)
+	return err == nil
+}

+ 12 - 12
fieldproject_medical/data_subject/src/subject_util/initcfg.go

@@ -33,31 +33,31 @@ func InitClass() {
 func initMgo() {
 	if IsLocal {
 		SourceMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
+			MongodbAddr: "127.0.0.1:12005",
+			DbName:      "qfw",
 			Size:        10,
-			UserName:    "",
-			Password:    "",
+			UserName:    "zhengkun",
+			Password:    "zk@123123",
 		}
-		SourceMgo.InitPool()
+		SourceMgo.InitPoolDirect()
 
 		QyxyMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
+			MongodbAddr: "127.0.0.1:12005",
+			DbName:      "mixdata",
 			Size:        10,
-			UserName:    "",
-			Password:    "",
+			UserName:    "zhengkun",
+			Password:    "zk@123123",
 		}
-		QyxyMgo.InitPool()
+		QyxyMgo.InitPoolDirect()
 
 		SpiMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
+			MongodbAddr: "127.0.0.1:12004",
 			DbName:      "zhengkun",
 			Size:        10,
 			UserName:    "",
 			Password:    "",
 		}
-		SpiMgo.InitPool()
+		SpiMgo.InitPoolDirect()
 	} else {
 		SourceMgo = &MongodbSim{
 			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",

+ 111 - 39
fieldproject_medical/data_subject/src/subject_util/mgo.go

@@ -3,7 +3,6 @@ package subject_util
 import (
 	"context"
 	"log"
-	qu "qfw/util"
 	"time"
 
 	"go.mongodb.org/mongo-driver/bson"
@@ -143,17 +142,48 @@ func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
 	ms = nil
 }
 
+func (m *MongodbSim) InitPoolDirect() {
+	opts := options.Client()
+	opts.SetConnectTimeout(3 * time.Second)
+	opts.ApplyURI("mongodb://" + m.MongodbAddr)
+	opts.SetMaxPoolSize(uint64(m.Size))
+	opts.SetDirect(true)
+	m.pool = make(chan bool, m.Size)
+
+	if m.UserName != "" && m.Password != "" {
+		cre := options.Credential{
+			Username:   m.UserName,
+			Password:   m.Password,
+			AuthSource: "admin",
+		}
+		opts.SetAuth(cre)
+	}
+
+	opts.SetMaxConnIdleTime(2 * time.Hour)
+	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
+	m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
+	client, err := mongo.Connect(m.ShortCtx, opts)
+	if err != nil {
+		log.Println("mgo init error:", err.Error())
+	} else {
+		m.C = client
+		log.Println("init success")
+	}
+}
+
 func (m *MongodbSim) InitPool() {
 	opts := options.Client()
 	opts.SetConnectTimeout(3 * time.Second)
 	opts.ApplyURI("mongodb://" + m.MongodbAddr)
 	opts.SetMaxPoolSize(uint64(m.Size))
+	//opts.SetDirect(true)
 	m.pool = make(chan bool, m.Size)
 
 	if m.UserName != "" && m.Password != "" {
 		cre := options.Credential{
-			Username: m.UserName,
-			Password: m.Password,
+			Username:   m.UserName,
+			Password:   m.Password,
+			AuthSource: "admin",
 		}
 		opts.SetAuth(cre)
 	}
@@ -177,7 +207,21 @@ func (m *MongodbSim) Close() {
 	<-m.pool
 }
 
-//批量插入
+// 新建表并生成索引
+func (m *MongodbSim) CreateIndex(c string, models []mongo.IndexModel) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	names, err := coll.Indexes().CreateMany(m.Ctx, models)
+	if err == nil && len(names) > 0 {
+		return true
+	} else {
+		log.Println("CreateIndex Error:", err)
+		return false
+	}
+}
+
+// 批量插入
 func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
 	m.Open()
 	defer m.Close()
@@ -204,7 +248,7 @@ func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[
 	return r.UpsertedIDs, true
 }
 
-//批量插入
+// 批量插入
 func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -223,7 +267,7 @@ func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	return true
 }
 
-//保存
+// 保存
 func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	m.Open()
 	defer m.Close()
@@ -235,7 +279,7 @@ func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	return r.InsertedID
 }
 
-//更新by Id
+// 更新by Id
 func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -247,7 +291,29 @@ func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	return true
 }
 
-//删除by id
+func (m *MongodbSim) UpdateStrId(c, id string, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": id}, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+func (m *MongodbSim) UpdateQueryData(c string, query map[string]interface{}, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, query, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+// 删除by id
 func (m *MongodbSim) DeleteById(c, id string) int64 {
 	m.Open()
 	defer m.Close()
@@ -259,7 +325,7 @@ func (m *MongodbSim) DeleteById(c, id string) int64 {
 	return r.DeletedCount
 }
 
-//通过条件删除
+// 通过条件删除
 func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	m.Open()
 	defer m.Close()
@@ -271,7 +337,7 @@ func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	return r.DeletedCount
 }
 
-//findbyid
+// findbyid
 func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	m.Open()
 	defer m.Close()
@@ -282,7 +348,19 @@ func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	return v
 }
 
-//findone
+// findbystrid
+func (m *MongodbSim) FindByStrId(c, id string, fields interface{}) map[string]interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	op := options.FindOne()
+	r := coll.FindOne(m.Ctx, map[string]interface{}{"_id": id}, op.SetProjection(fields))
+	v := map[string]interface{}{}
+	r.Decode(&v)
+	return v
+}
+
+// findone
 func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
 	m.Open()
 	defer m.Close()
@@ -293,7 +371,7 @@ func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]
 	return v
 }
 
-//find
+// find
 func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
 	m.Open()
 	defer m.Close()
@@ -313,7 +391,27 @@ func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields i
 	return results, nil
 }
 
-//创建_id
+// find
+func (m *MongodbSim) FindLimit(c string, query map[string]interface{}, sort, fields interface{}, limit int64) ([]map[string]interface{}, error) {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	op := options.Find()
+	r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields), op.SetLimit(limit))
+	if err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+
+	var results []map[string]interface{}
+	if err = r.All(m.Ctx, &results); err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	return results, nil
+}
+
+// 创建_id
 func NewObjectId() primitive.ObjectID {
 	return primitive.NewObjectID()
 }
@@ -326,29 +424,3 @@ func StringTOBsonId(id string) primitive.ObjectID {
 func BsonTOStringId(id interface{}) string {
 	return id.(primitive.ObjectID).Hex()
 }
-
-//return
-func IsMarkInterfaceMap(t interface{}) []map[string]interface{} {
-	p_list := []map[string]interface{}{}
-	if yl_list_1, ok_1 := t.(primitive.A); ok_1 {
-		p_list = qu.ObjArrToMapArr(yl_list_1)
-	} else {
-		if yl_list_2, ok_2 := t.([]interface{}); ok_2 {
-			p_list = qu.ObjArrToMapArr(yl_list_2)
-		}
-	}
-	return p_list
-}
-
-//return
-func IsMarkInterfaceArr(t interface{}) []string {
-	sub_list := []string{}
-	if list_1, ok_1 := t.(primitive.A); ok_1 {
-		sub_list = qu.ObjArrToStringArr(list_1)
-	} else {
-		if list_2, ok_2 := t.([]interface{}); ok_2 {
-			sub_list = qu.ObjArrToStringArr(list_2)
-		}
-	}
-	return sub_list
-}