猿问

mgo 将 mapreduce 转换为聚合命令

我正在尝试将此函数从 mapreduce 转换为聚合。

上述函数的结果将是[{pending 1}]

当我运行我的匹配组时,我[{pending 0}]从下面的代码中得到:

  mat := bson.M{

            "$match": bson.M{"device_id": devId},

    }


    grp := bson.M{

            "$group": bson.M{

                    "_id": "$status",

                    "count": bson.M{

                            "$sum": 1,

                    },

            },

    }


    pipe := c.Pipe([]bson.M{mat,grp})

    pipe.One(&result)

但我认为 mongo shell 中的命令也一样[{pending 1}]。


db.getCollection("auth_sets").aggregate([

{

    $match: {

        device_id:"5c79601d152ece00012f5831"

    }

},

{

    $group: {

        _id:"$status",

        count: {

            $sum: 1

        }

     }

},

]);

我怎样才能得到它,以便我的管道返回[{pending 1}]?


我正在更改它,以便我可以使用 Mongo Atlas 不允许 mapreduce。


有只小跳蛙
浏览 166回答 1
1回答

墨色风雨

您的mgo查询结构没问题,问题是字段名称count。该模型期望Value:var result []struct {    Status string `bson:"_id"`    Value  int}所以把$group舞台改成这样:grp := bson.M{        "$group": bson.M{                "_id": "$status",                "value": bson.M{   // Note lowercased "value"!                        "$sum": 1,                },        },}它应该有效。或者,如果可以,请更改模型:var result []struct {    Status string `bson:"_id"`    Value  int    `bson:"count"`}只有其中一个需要更改,才能与另一个保持一致。最后一件事:如果您使用Query.One(),则result不能是切片(One()恰好需要一个文档)。result如果您使用 eg ,请使用切片类型Query.All()。因此,如果您要使用Query.One(),请使用结果:var result struct {    Status string `bson:"_id"`    Value  int    `bson:"count"`}另外Query.One()并Query.All()返回错误,请检查它!
随时随地看视频慕课网APP

相关分类

Go
我要回答