mgo 将 mapreduce 转换为聚合命令

mgo convert mapreduce to aggregations command

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

https://github.com/mendersoftware/deviceauth/blob/be2f9745e14bbe87121d99ac6c396f41ca7438e2/store/mongo/datastore_mongo.go#L826

上述函数的结果将是 [{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
        }
     }
},
]);

我怎样才能得到它,这样我的烟斗就可以 return [{pending 1}]?

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

您的 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 的切片类型,例如Query.All().

因此,如果您要使用 Query.One(),请使用结果:

var result struct {
    Status string `bson:"_id"`
    Value  int    `bson:"count"`
}

还有Query.One()Query.All()return一个错误,一定要检查一下!