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

mgo 将 mapreduce 转换为聚合命令

mgo 将 mapreduce 转换为聚合命令

Go
有只小跳蛙 2023-06-12 15:32:53
我正在尝试将此函数从 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。
查看完整描述

1 回答

?
墨色风雨

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

您的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()返回错误,请检查它!


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号