mgo使用pipe来实现mongodb中的aggregation,所以在实现mongodb中的一些方法的时候就需要我们自己去拼接,现在使用go给大家分享一下我实现sortByCount的方法,大家可以自己自己实现一些其它的方法,如果有需要,我会继续实现一些其中的方法,希望大家多多关注! 现在直接上代码
type FieldCount struct {
Field string `json:"field"`
Count int `json:"count"`
}
type fieldGroup struct {
ID map[string]string `bson:"_id,omitempty"`
Count int
}
/*
*
* db 数据库名字
* coll collections
* field 按照哪个字段分类
* sort 是否排序
*/
func SortByCount(db string, coll string, field string, sort bool) (fieldCount []FieldCount, err error) {
session, err := mgo.DialWithTimeout(MONGODB_URL, time.Second)
if err != nil {
panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB(db).C(coll)
var pipeLine []bson.M
if sort {
pipeLine = []bson.M {
bson.M{"$group" : bson.M{"_id" : bson.M{field : "$" + field}, "count" : bson.M{"$sum" : 1}}},
bson.M{"$sort" : bson.M{"count" : -1}},
}
} else {
pipeLine = []bson.M {
bson.M{"$group" : bson.M{"_id" : bson.M{field : "$" + field}, "count" : bson.M{"$sum" : 1}}},
}
}
pipe := c.Pipe(pipeLine)
var group []fieldGroup
err = pipe.All(&group)
for _, g := range group {
fieldCount = append(fieldCount, FieldCount {
Field: g.ID[field],
Count: g.Count,
})
}
return
}
下面是我的测试方法:
func TestSortByCount(t *testing.T) {
fieldcounttest, _ := SortByCount(constantutils.IP_URL, "logs20180601", "host", true)
for _, item := range fieldcounttest {
fmt.Print(item.Field + " : ")
fmt.Println(item.Count)
}
}
使用go中自带的测试类,大家可以运行go test -v xxxx_test.go 就可以看到输出结果了。大家有什么需要可以在下面留言,由于我也是第一次写这个东西,参考了一下其他作者的和官网的,
参考链接为:https://docs.mongodb.com/manual/reference/operator/aggregation/group/
https://play.golang.org/p/rDodxp22Jq