Вы можете попробовать это:
db.yourCollectionName.aggregate([{
$group: {
_id: { name: '$_id.name', dept: '$_id.dept' },
data: { $push: { $split: [{ $concat: ["$_id.Code", ",", { $toString: "$_id.count" }] }, ','] } }
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: ['$_id', { $arrayToObject: "$data" }] } }
}])
Объяснение:
- Здесь мы группируемся по
name
& dept
плюс выполняем конкатенацию Code
& count
в виде строки и разбиение этих двух элементов на массив. - Затем мы конвертируем массив
data
в объект, объединяем его с _id
объектом и делаем конечный объект новым root.
Проверьте это здесь: MongoDB-Playground
Выше вы получите требуемый вывод, но если вы хотите значения "Code1" : "4", "Code2": "4"
как числа вместо строки, поскольку входной документ имеет count
тип поля как int
, затем попробуйте это:
db.yourCollectionName.aggregate([{
$group: {
_id: { name: '$_id.name', dept: '$_id.dept' },
data: { $push: { $split: [{ $concat: ["$_id.Code", ",", { $toString: "$_id.count" }] }, ','] } }
}
}, {
$addFields: {
data: {
$map:
{
input: "$data",
as: "each",
in: [{ $arrayElemAt: ['$$each', 0] }, { $toInt: { $arrayElemAt: ['$$each', 1] } }]
}
}
}
},
{
$replaceRoot: { newRoot: { $mergeObjects: ['$_id', { $arrayToObject: "$data" }] } }
}])
Только изменение будет, поскольку мы преобразовали поле count
из числа в строку в $group
этап для объединения, мы преобразуем его обратно в число.
Проверьте это здесь: MongoDB-Playground