Агрегирование по совокупности - PullRequest
0 голосов
/ 19 февраля 2020

У нас есть коллекция следующим образом - Пакеты (0,1,2 etc) выполняющихся заданий в чанах.
Каждый пакет будет иметь несколько чанков / документов с заданиями.

Нам нужно агрегировать задания для каждого пакета.
После этого счетчик работ для каждого пакета необходимо вычитать из счетчика для пакета '0'.

Результатом будет массив / сбор разницы в количестве заданий для каждого пакета с пакетом 0 соответственно.
Если есть пакеты 'x', размер массива будет, очевидно, x-1.

Можно ли это сделать за одну операцию агрегирования?

{
    "_id": ObjectId("xxxxxx"),
    "batch": ["0"],
    "jobs":2500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["1"],
    "jobs":1500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["0"],
    "jobs":1500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["2"],
    "jobs":3500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["1"],
    "jobs":500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["0"],
    "jobs":1500
},
{
    "_id": ObjectId("xxxxxx"),
    "batch": ["3"],
    "jobs":2500
},

Ожидаемый результат:

[ 3500,2000,3000]

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете попробовать это:

db.collection.aggregate([
    { $unwind: '$batch' },
    { $group: { _id: '$batch', count: { $sum: '$jobs' } } },
    { $group: { _id: '', data: { $push: '$$ROOT' } } },
    {
        $addFields: {
            value: { $filter: { input: '$data', as: 'e', cond: { $eq: ['$$e._id', '0'] } } }
        }
    },
    {
        $project: {
            _id: 0,
            data: { $filter: { input: { $map: { input: '$data', as: 'e', in: { $subtract: [{ $arrayElemAt: ['$value.count', 0] }, '$$e.count'] } } }, as: 'e', cond: { $ne: ['$$e', 0] } } }
        }
    }])

Тест: MongoDB-Playground

...