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

时间:2019-12-28 17:39:47

标签: mongodb 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中进行聚合?

this种方法可以执行汇总,但是文档对我来说还不清楚。我知道我应该进行某种bson查询,但是我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

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)
}

尝试上述解决方案,它将起作用。

答案 1 :(得分:0)

为补充已接受的解决方案,我与光标迭代和解码共享了完整的代码。我将"_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 Result
for cursor.Next(ctx) {
    err := cursor.Decode(&res)
    if err != nil {
        return err
    }
    fmt.Printf("Element %v", res)
}