I have an aggregation query like this:
...
{
'$unwind': {
path: '$modifier'
}
}, {
'$group': {
'_id': {
'date': {
'$dateToString': {
'format': '%d/%m/%Y',
'date': '$updatedTime'
}
}
},
'$$modifier': { '$sum': 1 }
}
},
...
and I would like to use modifier values, a result of the previous stage ($unwind), as a field in the next stage ($group). The detail is in the picture below. How should I accomplish it?
MongoDB aggregation question detailed picture
-- Current --
This is the output of $unwind stage :
updatedTime:2020-03-27T11:02:43.608 00:00
modifier:"[email protected]"
updatedTime:2020-03-27T11:02:43.608 00:00
modifier:"[email protected]"
This is the output of $group stage :
_id: { date:"27/03/2020" }
modifier:1
-- Expected --
the output of $unwind stage :
updatedTime:2020-03-27T11:02:43.608 00:00
modifier:"[email protected]"
updatedTime:2020-03-27T11:02:43.608 00:00
modifier:"[email protected]"
This is the output of $group stage :
_id: { date:"27/03/2022" }
[email protected]:1
[email protected]:1
total:2
Notice that "[email protected]" and "[email protected]" come from $unwind stage which is before $group stage. total is the total of modifier (examples: '[email protected]' and '[email protected]') values.
Any suggestion is appreciated.
CodePudding user response:
It's not straight but You need to group by both the properties date and email and do another group by only date and construct the array of modifiers and do replace that in root,
$groupbyupdatedTimeandmodifierand get total count$groupby only date property and construct the array of object ofmodifierandcountin key-value pair$arrayToObjectconvert that key-value pair into object$mergeObjectto merge required properties like we addeddateproperty and above array to object operation result$replaceRootto replace above merged object in root of the document
{
"$group": {
"_id": {
"date": {
"$dateToString": {
"format": "%d/%m/%Y",
"date": "$updatedTime"
}
},
"modifier": "$modifier"
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"modifiers": {
"$push": {
"k": "$_id.modifier",
"v": "$count"
}
},
"total": { "$sum": "$count" }
}
},
{
"$replaceRoot": {
"newRoot": {
"$mergeObjects": [
{
"date": "$_id",
"total": "$total"
},
{ "$arrayToObject": "$modifiers" }
]
}
}
}
