Вы можете попробовать ниже агрегации:
db.col.aggregate([
{
$group: {
_id: null,
obj: { $push: { k: "$_id", v: "$count" } },
keys: { $push: "$_id" }
}
},
{
$project: {
obj: {
$map: {
input: [ "S", "M", "L", "XL", "XXL", "XXXL" ],
as: "key",
in: {
$let: {
vars: { keyIndex: { $indexOfArray: [ "$keys", "$$key" ] } },
in: {
$cond: {
if: { $eq: [ "$$keyIndex", -1 ] },
then: { k: "$$key", v: 0 },
else: { $arrayElemAt: [ "$obj", "$$keyIndex" ] }
}
}
}
}
}
}
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$obj" }
}
}
])
По сути, вы должны начать с накопления всех ключей и значений в одном объекте, используя $ group с _id
, установленным на null
. Затем для обеспечения порядка ключей, которые вам нужны, вы можете использовать $ map с постоянным массивом в качестве входных данных. Сопоставление должно проверить, существует ли каждый размер во входных данных (используя $ indexOfArray - возвращает -1
в противном случае) и принять это значение ( $ arrayElemAt ) или создать значение по умолчанию с 0
в противном случае. Логика ветвления может быть достигнута с помощью $ cond .
На последнем этапе конвейера вы можете использовать $ arrayToObject для преобразования этого массива k-v
пар в один объект и $ replaceRoot для перевода этого объекта на корневой уровень.