猿问

如何使用 mongo-driver 在 Go 中执行聚合

我有一个包含 3 个字段的 MongoDB 集合:


_id: ObjectId

field1: Number

field2: Number

我正在进行此聚合以获得“不同的”field1/field2 行并计算结果总数。这在客户端(Robo3t)中工作正常:


db.mycollection.aggregate([

    {

        $group: { 

            _id: { field1: "$field1", field2: "$field2" },

        }

    },

    { 

        $group: { 

            _id: null, count: { $sum: 1 } 

        } 

    }

])

结果:


{

    "_id" : null,

    "count" : 57.0

}

我如何使用mongo-driver在 Go 中进行这种聚合?


有这种方法可以执行聚合,但我不清楚文档。我知道我应该做某种 bson 查询,但我不知道从哪里开始。


叮当猫咪
浏览 121回答 2
2回答

慕桂英3389331

group :=[]bson.M{bson.M{    "$group": bson.M{        "_id":bson.M{            "field1": "$field1",            "field2": "$field2"        }    }},bson.M {    "$group": bson.M{        "_id":nil,        "count": bson.M{            "$sum":1        }    }}} cursor, err := coll.Aggregate(context.Background(), mongo.Pipeline{group})if err != nil {    log.Fatal(err)}尝试上面的解决方案,它会起作用。

FFIVE

为了补充已接受的解决方案,我将共享带有光标迭代和解码的完整代码。我将 更改"_id": nil为"_id": ""来接收字符串并能够毫无问题地解码为结构。pipeline := []bson.M{    {        "$group": bson.M{"_id": bson.M{"field1": "$field1", "field2": "$field2"}},    },    {        "$group": bson.M{"_id": "", "count": bson.M{"$sum": 1}},    },}cursor, err := coll.Aggregate(ctx, pipeline)if err != nil {    return err}type Result struct {    ID    string `bson:"_id"`    Count int    `bson:"count"`}var res Resultfor cursor.Next(ctx) {    err := cursor.Decode(&res)    if err != nil {        return err    }    fmt.Printf("Element %v", res)}
随时随地看视频慕课网APP

相关分类

Go
我要回答