func (d *DataBrowserController) dboxAggr(tblename string, field string, ctx dbox.IConnection, query dbox.IQuery, result, fieldAggr toolkit.M, cursor []toolkit.M, conn *colonycore.Connection) (toolkit.M, error) { aggregate := toolkit.M{} if conn.Driver == "mongo" { field = "$" + field } query = ctx.NewQuery().From(tblename) if result != nil { for k, _ := range result { if k == "SUM" { query = query.Aggr(dbox.AggrSum, field, "SUM") } if k == "AVG" { query = query.Aggr(dbox.AggrAvr, field, "AVG") } if k == "MAX" { query = query.Aggr(dbox.AggrMax, field, "MAX") } if k == "MIN" { query = query.Aggr(dbox.AggrMin, field, "MIN") } if conn.Driver == "mongo" { if k != "COUNT" { query = query.Group() } } csr, e := query.Cursor(nil) if e != nil { return nil, e } defer csr.Close() hasCount := []toolkit.M{} if k == "COUNT" { csr, e := query.Cursor(nil) if e != nil { return nil, e } defer csr.Close() count := csr.Count() hasCount = append(hasCount, aggregate.Set("count", count)) aggregate.Set("count", count) } else { e = csr.Fetch(&cursor, 0, false) if e != nil { return nil, e } } if _, countOK := aggregate["count"]; countOK { cursor = append(cursor, hasCount...) } for _, agg := range cursor { aggregate = agg if conn.Driver == "mongo" { for f, _ := range aggregate { if f == "_id" { aggregate.Unset(f) } } } fieldAggr.Set(field, aggregate) // toolkit.Printf("k:%v fieldArr:%v cursor:%v\n", k, field, fieldAggr) } } } return aggregate, nil }