| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | package bootableimport (	"encoding/json"	"golib/features/mo"	"golib/infra/ii")func objectToStr(row mo.M) string {	b, err := json.Marshal(row)	if err != nil {		return err.Error()	}	return string(b)}func handleTypeFloat(fields []ii.FieldInfo, row mo.M) {	for _, field := range fields {		if field.Type != mo.TypeDouble {			continue		}		if field.Decimal <= 0 {			continue		}		oldValue, ok := row[field.Name].(float64)		if !ok {			continue		}		newValue, err := field.Convert(oldValue)		if err == nil {			row[field.Name] = newValue		}	}}func handleTypeObject(fields []ii.FieldInfo, row mo.M) {	for _, field := range fields {		if field.Type != mo.TypeObject {			continue		}		oldMap, ok := row[field.Name].(mo.M)		if !ok {			continue		}		for k, v := range oldMap {			row[field.Name+"."+k] = v		}		row[field.Name] = objectToStr(oldMap)	}}func handleFieldLookup(fields []ii.FieldInfo, row mo.M) {	for _, field := range fields {		if !field.HasLookup() {			continue		}		oldList, ok := row[field.Lookup.AS].(mo.A)		if !ok {			continue		}		// 仅 List == false 时才展开数据		if field.Lookup.List || len(oldList) == 0 {			continue		}		for k, v := range oldList[0].(mo.M) {			row[field.Name+"."+field.Lookup.AS+"."+k] = v		}	}}// getLookupResult 查询 rows 包含 asName 结果的数据的索引// MongoDB 会对 $lookup 指令始终返回 asName 字段, 该字段数据类型始终为 mo.Afunc getLookupResult(asName []string, resp *Response) {	row := make([]mo.M, 0, len(resp.Rows))	for _, as := range asName {		for i := 0; i < len(resp.Rows); i++ {			list, ok := resp.Rows[i][as]			if !ok {				panic("as name not found in row")			}			if len(list.(mo.A)) > 0 {				row = append(row, resp.Rows[i])			}		}	}	resp.Rows = row}
 |