Mgo конвертировать mapreduce в агрегации команды - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь преобразовать эту функцию здесь из 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 дает [{pending 1}].

db.getCollection("auth_sets").aggregate([
{
    $match: {
        device_id:"5c79601d152ece00012f5831"
    }
},
{
    $group: {
        _id:"$status",
        count: {
            $sum: 1
        }
     }
},
]);

Как я могуполучите так, чтобы мой канал вернул [{pending 1}]?

Я изменяю его, так что я могу использовать Mongo Atlas с не позволяет mapreduce.

1 Ответ

0 голосов
/ 02 марта 2019

Ваша структура запроса 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() возвращают ошибку, проверьте ее!

...