登录
首页 >  Golang >  Go问答

利用 golang 和 MongoDB 实现对管道中记录进行分组并计算总数

来源:stackoverflow

时间:2024-03-18 20:21:30 271浏览 收藏

在使用 Go 和 MongoDB 时,对管道中的记录进行分组并计算总数是一个常见任务。通过使用 MongoDB 聚合框架,可以实现分组和计数功能。本文将提供两种方法来实现这一目标:仅获取计数或获取每个分组的计数以及分组总数。第一种方法使用 `$distinct` 操作符获取分组的计数,而第二种方法使用嵌套的 `$group` 操作符获取分组的计数和总数。通过这些方法,开发者可以轻松地从 MongoDB 中提取分组数据并进行统计分析。

问题内容

我正在使用golang和mongodb。下面是我的go代码

matchStage := bson.M{"$match": bson.M{'country':'India'}}
groupByStage := bson.M{"$group": bson.M{
        "_id":             "$state",
        "city_count": bson.M{"$sum": 1},
    }}
pipeline := getCollection.Pipe([]bson.M{
        matchStage,
        groupByStage,
    })

 document := []bson.M{}
 err = pipeline.All(&document)

我正在获取每个州的城市计数,但我想获取分组州的总数。这只是示例,但我想获取类似的数据。因此,除了循环之外还有任何解决方案来获取分组数据的总数不是对每个分组的数据进行计数?

我的输出就像 {'state1':3,'state2':4,'state3':1} 但我只想要 '3' 作为 count


解决方案


首先,您似乎正在使用 mgo 或它的其他版本。我强烈建议您使用 official go driver from mongodb

有两种方法可以回答您的问题:

如果您只想要计数,这不是您基本上需要的:

states := []string{}
err := getcollection.find(bson.m{'country': 'india'}).distinct("state", &states)
fmt.printf("%d\n", len(states))

如果您想要州的数量以及每个州的计数 - 可以添加第二组。

matchstage := bson.m{"$match": bson.m{'country':'india'}}
groupbystage := bson.m{"$group": bson.m{
        "_id": bson.m{
                 "country": "$country",
                 "state": "$state",
        },
        "city_count": bson.m{"$sum": 1},
    }}
groupbystage2 := bson.m{"$group": bson.m{
        "_id": "$_id.country",
        "city_counts": bson.m{
            "$push": bson.m{
                 "state": "$_id.state",
                 "city_count": "$city_count",
             },
        },
        "state_count": bson.m{"$sum": 1},
    }}
pipeline := getcollection.pipe([]bson.m{
        matchstage,
        groupbystage,
        groupbystage2,
    })

 document := []bson.m{}
 err = pipeline.all(&document)

你应该得到这样的东西

[{
    "_id": "India",
    "city_counts": [{'state1':3,'state2':4,'state3':1}],
    "state_count": 3
}]

本篇关于《利用 golang 和 MongoDB 实现对管道中记录进行分组并计算总数》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>