| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | package bootableimport (	"encoding/json"	"io"	"golib/features/mo"	"golib/infra/ii"	"golib/infra/svc")func ResolveFilter(reader io.Reader) (Filter, error) {	b, err := io.ReadAll(reader)	if err != nil {		return Filter{}, err	}	return ResolveFilterFrom(b)}func ResolveFilterFrom(b []byte) (Filter, error) {	var filter Filter	return filter, json.Unmarshal(b, &filter)}// HandleRows 展开 itemInfo 字段数据类型为 mo.TypeObject 和 mo.TypeArray 的数据// {"name": "123", "submap": {"name":111,"age":222}}func HandleRows(info ii.ItemInfo, rows []mo.M) {	objName := info.FieldType(mo.TypeObject)	lookupName := info.LookupField()	for i := 0; i < len(rows); i++ {		handleTypeObject(objName, rows[i])		handleFieldLookup(lookupName, rows[i])	}}func Find(itemInfo ii.ItemInfo, items ii.Items, filter Filter) (*Response, error) {	bootFilter, err := filter.Build(itemInfo, items)	if err != nil {		return nil, err	}	resp := new(Response)	resp.Rows = make([]mo.M, 0)	if err = svc.Aggregate(itemInfo.Name.String(), bootFilter, &resp.Rows); err != nil {		return nil, err	}	HandleRows(itemInfo, resp.Rows)	if len(filter.lookASName) > 0 {		getLookupResult(filter.lookASName, resp)	}	if len(filter.Filter) == 0 {		resp.Total, err = svc.EstimatedDocumentCount(itemInfo.Name.String())		if err != nil {			return nil, err		}	} else {		resp.Total = int64(len(resp.Rows))	}	return resp, nil}
 |