为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
叮当猫咪 2023-08-14 17:03:02
我有一个包含 3 个字段的 MongoDB 集合:_id: ObjectIdfield1: Numberfield2: 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 查询,但我不知道从哪里开始。
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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)

}

尝试上面的解决方案,它会起作用。


查看完整回答
反对 回复 2023-08-14
?
FFIVE

TA贡献1797条经验 获得超6个赞

为了补充已接受的解决方案,我将共享带有光标迭代和解码的完整代码。我将 更改"_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)

}


查看完整回答
反对 回复 2023-08-14
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信