Golang中如何对MongoDB中相同user_id的集合数据进行$group分组操作
Golang中如何对MongoDB中相同user_id的集合数据进行$group分组操作
如何在Golang中使用MongoDB对具有相同用户ID的集合数据进行$group分组?
标签: mongodb, go, mgo
更多关于Golang中如何对MongoDB中相同user_id的集合数据进行$group分组操作的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
你想让我们在这里回答这个问题,还是在 Stack Overflow 上回答?
更多关于Golang中如何对MongoDB中相同user_id的集合数据进行$group分组操作的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中使用MongoDB对具有相同user_id的集合数据进行$group分组操作,可以通过mgo驱动(或官方MongoDB Go驱动)实现。以下是使用mgo驱动的示例:
package main
import (
"fmt"
"log"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
type UserStats struct {
UserID string `bson:"_id"`
Count int `bson:"count"`
}
func main() {
session, err := mgo.Dial("localhost")
if err != nil {
log.Fatal(err)
}
defer session.Close()
collection := session.DB("test").C("users")
pipeline := []bson.M{
{
"$group": bson.M{
"_id": "$user_id",
"count": bson.M{"$sum": 1},
},
},
}
var results []UserStats
err = collection.Pipe(pipeline).All(&results)
if err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Printf("UserID: %s, Count: %d\n", result.UserID, result.Count)
}
}
如果使用官方MongoDB Go驱动(go.mongodb.org/mongo-driver),代码如下:
package main
import (
"context"
"fmt"
"log"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type UserStats struct {
UserID string `bson:"_id"`
Count int `bson:"count"`
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
log.Fatal(err)
}
defer client.Disconnect(ctx)
collection := client.Database("test").Collection("users")
pipeline := mongo.Pipeline{
{{"$group", bson.D{
{"_id", "$user_id"},
{"count", bson.D{{"$sum", 1}}},
}}},
}
cursor, err := collection.Aggregate(ctx, pipeline)
if err != nil {
log.Fatal(err)
}
defer cursor.Close(ctx)
var results []UserStats
if err = cursor.All(ctx, &results); err != nil {
log.Fatal(err)
}
for _, result := range results {
fmt.Printf("UserID: %s, Count: %d\n", result.UserID, result.Count)
}
}
这两个示例都通过聚合管道中的$group阶段,按user_id字段分组并计算每个用户的文档数量。可以根据需要修改$group中的聚合操作,比如使用$sum、$avg等其他聚合运算符。

