Browse Source

fix:批量保存时,添加数量限制

Roc 10 months ago
parent
commit
65de29f83e
2 changed files with 121 additions and 16 deletions
  1. 73 5
      models/mgo/base_from_business_data.go
  2. 48 11
      models/mgo/edb_data_business.go

+ 73 - 5
models/mgo/base_from_business_data.go

@@ -187,22 +187,90 @@ func (m *BaseFromBusinessData) GetCountDataList(whereParams interface{}) (count
 	return
 }
 
+// InsertDataByColl
+// @Description: 写入单条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param addData interface{}
+// @return err error
+func (m *BaseFromBusinessData) InsertDataByColl(coll *qmgo.Collection, addData interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.InsertOne(ctx, addData)
+	if err != nil {
+		fmt.Println("InsertDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
 // BatchInsertData
 // @Description: 批量写入数据
 // @author: Roc
 // @receiver m
 // @datetime 2024-04-26 14:22:18
-// @param dataList interface{}
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
 // @return err error
-func (m *BaseFromBusinessData) BatchInsertData(dataList interface{}) (err error) {
+func (m *BaseFromBusinessData) BatchInsertData(bulk int, dataList []interface{}) (err error) {
 	db := utils.MgoDataCli.Database(m.DataBaseName())
 	coll := db.Collection(m.CollectionName())
+
+	return m.BatchInsertDataByColl(coll, bulk, dataList)
+}
+
+// BatchInsertDataByColl
+// @Description: 批量写入数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param coll *qmgo.Collection
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *BaseFromBusinessData) BatchInsertDataByColl(coll *qmgo.Collection, bulk int, dataList []interface{}) (err error) {
 	ctx := context.TODO()
-	_, err = coll.InsertMany(ctx, dataList)
-	if err != nil {
-		fmt.Println("BatchInsertData:Err:" + err.Error())
+	dataNum := len(dataList)
+	if dataNum <= 0 {
+		return
+	}
+
+	// 不设置每次保存切片数量大小,或者实际数据量小于设置的切片数量大小,那么就直接保存吧
+	if bulk <= 0 || dataNum <= bulk {
+		_, err = coll.InsertMany(ctx, dataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
 		return
 	}
+
+	// 分批保存
+	i := 0
+	tmpAddDataList := make([]interface{}, 0)
+	for _, v := range dataList {
+		tmpAddDataList = append(tmpAddDataList, v)
+		i++
+		if i >= bulk {
+			_, err = coll.InsertMany(ctx, tmpAddDataList)
+			if err != nil {
+				fmt.Println("BatchInsertData:Err:" + err.Error())
+				return
+			}
+			i = 0
+			tmpAddDataList = make([]interface{}, 0)
+		}
+	}
+
+	if len(tmpAddDataList) > 0 {
+		_, err = coll.InsertMany(ctx, tmpAddDataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+	}
+
 	return
 }
 

+ 48 - 11
models/mgo/edb_data_business.go

@@ -239,13 +239,13 @@ func (m *EdbDataBusiness) GetCountDataList(whereParams interface{}) (count int64
 // @author: Roc
 // @receiver m
 // @datetime 2024-04-26 14:22:18
-// @param addData EdbDataBusiness
+// @param addData interface{}
 // @return err error
-func (m *EdbDataBusiness) InsertDataByColl(coll *qmgo.Collection, addData EdbDataBusiness) (err error) {
+func (m *EdbDataBusiness) InsertDataByColl(coll *qmgo.Collection, addData interface{}) (err error) {
 	ctx := context.TODO()
 	_, err = coll.InsertOne(ctx, addData)
 	if err != nil {
-		fmt.Println("BatchInsertData:Err:" + err.Error())
+		fmt.Println("InsertDataByColl:Err:" + err.Error())
 		return
 	}
 
@@ -257,13 +257,14 @@ func (m *EdbDataBusiness) InsertDataByColl(coll *qmgo.Collection, addData EdbDat
 // @author: Roc
 // @receiver m
 // @datetime 2024-04-26 14:22:18
-// @param dataList interface{}
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
 // @return err error
-func (m *EdbDataBusiness) BatchInsertData(dataList []EdbDataBusiness) (err error) {
+func (m *EdbDataBusiness) BatchInsertData(bulk int, dataList []interface{}) (err error) {
 	db := utils.MgoDataCli.Database(m.DataBaseName())
 	coll := db.Collection(m.CollectionName())
 
-	return m.BatchInsertDataByColl(coll, dataList)
+	return m.BatchInsertDataByColl(coll, bulk, dataList)
 }
 
 // BatchInsertDataByColl
@@ -271,16 +272,52 @@ func (m *EdbDataBusiness) BatchInsertData(dataList []EdbDataBusiness) (err error
 // @author: Roc
 // @receiver m
 // @datetime 2024-04-26 14:22:18
-// @param dataList interface{}
+// @param coll *qmgo.Collection
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
 // @return err error
-func (m *EdbDataBusiness) BatchInsertDataByColl(coll *qmgo.Collection, dataList []EdbDataBusiness) (err error) {
+func (m *EdbDataBusiness) BatchInsertDataByColl(coll *qmgo.Collection, bulk int, dataList []interface{}) (err error) {
 	ctx := context.TODO()
-	_, err = coll.InsertMany(ctx, dataList)
-	if err != nil {
-		fmt.Println("BatchInsertData:Err:" + err.Error())
+	dataNum := len(dataList)
+	if dataNum <= 0 {
 		return
 	}
 
+	// 不设置每次保存切片数量大小,或者实际数据量小于设置的切片数量大小,那么就直接保存吧
+	if bulk <= 0 || dataNum <= bulk {
+		_, err = coll.InsertMany(ctx, dataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 分批保存
+	i := 0
+	tmpAddDataList := make([]interface{}, 0)
+	for _, v := range dataList {
+		tmpAddDataList = append(tmpAddDataList, v)
+		i++
+		if i >= bulk {
+			_, err = coll.InsertMany(ctx, tmpAddDataList)
+			if err != nil {
+				fmt.Println("BatchInsertData:Err:" + err.Error())
+				return
+			}
+			i = 0
+			tmpAddDataList = make([]interface{}, 0)
+		}
+	}
+
+	if len(tmpAddDataList) > 0 {
+		_, err = coll.InsertMany(ctx, tmpAddDataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+	}
+
 	return
 }