Mon go агрегация для сбора элементов массива на основе имени поля - PullRequest
2 голосов
/ 16 января 2020

У меня есть агрегированный документ mon go, как показано ниже. Есть две разные партии (" -Minor" и " -Major"), и у каждой партии тоже есть "batchElements".

{
    "_id" : "123",
    "info" : {
        "batch" : "Batch1-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch2-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch3-Major"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch4-Major"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
}

Как собрать все «batchElements» из « -Minor» и « -Major» и создать документ, как показано ниже;

Вывод:

  {
    "_id" : "123",
    "minorElements" : [
        [{}, {}, {}, ..... {} ], // elements of "Batch1-Minor"
        [{}, {}, {}, ..... {} ], // elements of "Batch2-Minor"
        ...                      // elements of "BatchN-Minor"
    ],
    "majorElements" : [
        [{}, {}, {}, ..... {} ], // elements of "Batch3-Major"
        [{}, {}, {}, ..... {} ], // elements of "Batch4-Major"
        ...                      // elements of "BatchN-Major"
    ]
}

1 Ответ

2 голосов
/ 16 января 2020

Вы можете начать с $ split , чтобы получить «тип» вашей партии как часть вашей $ группы _id. Затем вы можете запустить еще одну $group, чтобы сделать minor и major части одного и того же документа. На последнем шаге вам нужно $ replace Root вместе с $ arrayToObject , чтобы повысить оба массива до уровня root.

db.collection.aggregate([
    {
        $group: {
            _id: {
                id: "$_id",
                type: { $arrayElemAt: [ { $split: [ { $toLower: "$info.batch" }, "-" ] }, 1 ] }
            },
            docs: { $push: "$batchElements.elements" }
        }
    },
    {
        $group: {
            _id: "$_id.id",
            data: { $push: { k: { $concat: ["$_id.type","Elements"] }, v: "$docs" } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [ { _id: "$_id" }, { $arrayToObject: "$data" } ]
            }
        }
    }
])

Mon go Детская площадка

...