Mam zagregowany dokument mongo, jak poniżej. Istnieją dwie różne partie („ -Minor” i „ -Major”), a każda partia ma również „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" : [ 
             { },  { }, .... { }
        ]
    }
}

Jak mogę zebrać wszystkie „batchElements” z „ -Minor” i „ -Major” i utworzyć dokument jak poniżej;

Wynik:

  {
    "_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"
    ]
}
2
Boat 16 styczeń 2020, 15:13

1 odpowiedź

Najlepsza odpowiedź

Możesz zacząć od $ Split, aby uzyskać " Typ "swojej partii jako części swojej $ Group _id. Następnie możesz uruchomić inny $group, aby zrobić minor i major części tego samego dokumentu. W ostatnim kroku potrzebujesz $ Wymiana wraz z $ arraytoObject, aby promować oba tablice do poziomu korzenia.

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" } ]
            }
        }
    }
])

Plac zabaw Mongo

2
mickl 16 styczeń 2020, 13:04