Ja, met behulp van $arrayToObject
en $map
om de bestaande array te converteren naar een formaat dat het accepteert:
db.collection.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$concatArrays": [
[{ "k": "date", "v": "$_id.date" }],
{ "$map": {
"input": "$aggr",
"in": { "k": "$$this.gender", "v": "$$this.count" }
}}
]
}
}
}}
])
Natuurlijk, als dit eigenlijk alleen op de "staart" van een bestaande aggregatie staat en je hebt niet ten minste MongoDB 3.4.4 waar de operator wordt geïntroduceerd, dan kun je het resultaat natuurlijk eenvoudig opnieuw vormgeven in de clientcode:
db.collection.aggregate([
// existing pipeline
]).map(d =>
Object.assign(
{ date: d._id.date },
d.aggr.reduce((acc,curr) =>
Object.assign(acc,{ [curr.gender]: curr.count }),{}
)
)
)