Невозможно с v3.6
.
Причина: Для преобразования в key:value
[где key
должен быть String
] объект, нам нужно использовать Оператор $ arrayToObject .
Поскольку значения platform
, Type
, Id
являются Numeric
, мы не можем преобразоваться в структуру key:value
, поскольку $ toString доступно с v4.0
.
Обходной путь: Мы можем создать массив с литералом, эквивалентным значениям platform
, Type
и Id
. Или мы можем использовать оператор $ switch , чтобы вручную определить, как преобразовать числа в эквивалентное литеральное значение.
db.collection.aggregate([
{
$addFields: {
converter: ["0","1","2","3","4","5"] // add here items equivalent to numbers
}
},
{
"$group": {
"_id": {
Id: {
$arrayElemAt: ["$converter","$Id"]
},
Type: {
$arrayElemAt: ["$converter","$Type"]
},
platform: {
$arrayElemAt: ["$converter","$platform"]
}
},
"count": {
$sum: 1
}
}
},
{
"$group": {
"_id": {
Id: "$_id.Id",
Type: "$_id.Type"
},
"data": {
$push: {
k: "$_id.platform",
v: "$count"
}
}
}
},
{
"$group": {
"_id": "$_id.Id",
"data": {
$push: {
k: "$_id.Type",
v: {$arrayToObject: "$data"}
}
}
}
},
{
"$group": {
"_id": null,
"data": {
$push: {
k: "$_id",
v: {$arrayToObject: "$data"}
}
}
}
},
{
$replaceRoot: {
newRoot: {$arrayToObject: "$data"}
}
}
])
MongoPlayground