Я предполагаю, что вы хотите запустить такое агрегирование динамически (не зная имен ключей). В таком случае вам нужно начать с $ objectToArray , затем запустить double $ group , чтобы получить массив для каждого ключа, и на последнем шаге вам нужно запустить $ arrayToObject чтобы вернуть имена клавиш в качестве ключей:
db.collection.aggregate([
{
$project: {
doc: {
$filter: {
input: { $objectToArray: "$$ROOT" },
cond: { $ne: [ "$$this.k", "_id" ] }
}
}
}
},
{
$unwind: "$doc"
},
{
$group: {
_id: "$doc.k",
values: { $push: "$doc.v" }
}
},
{
$group: {
_id: null,
data: { $push: { k: "$_id", v: "$values" } }
}
},
{
$replaceRoot: {
newRoot: {
$arrayToObject: "$data"
}
}
}
])
Пн go Детская площадка
РЕДАКТИРОВАТЬ: проблема становится очень простой, если вы знаете имена клавиши:
db.collection.aggregate([
{
$group: {
_id: null,
a1: { $push: "$a1" },
a2: { $push: "$a2" }
}
}
])