Это плохая практика добавлять разнородные элементы (в вашем случае: 'a': 3, 'b': 2
) в массив, я преобразовал тип shares
во что-то вроде:
{
key: "$_id.shares",
count: "$count"
}
Вам нужно сделать в следующем порядке:
- Размотка массива
s
. - Группировка по составным _id
name
и s
. - Снова группировка по _id
_id.name
и pu sh объекты типа key
и count
в массив shares
.
Вы можете попробовать следующий запрос:
db.collection.aggregate([
{
$unwind: "$s"
},
{
$group: {
_id: {
name: "$name",
shares: "$s"
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: "$_id.name",
shares: {
$push: {
key: "$_id.shares",
count: "$count"
}
}
}
}
])
Выход
[
{
"_id": "jones",
"shares": [
{
"count": 1,
"key": "c"
},
{
"count": 1,
"key": "b"
}
]
},
{
"_id": "igor",
"shares": [
{
"count": 3,
"key": "a"
},
{
"count": 2,
"key": "b"
}
]
}
]
MongoPlayGroundLink