Hvis du vil beholde dokumentoplysninger, så skal du som udgangspunkt $push
det i et array. Men selvfølgelig, så har du din $max
værdier, skal du filtrere indholdet af arrayet for kun de elementer, der matcher:
db.coll.aggregate([
{ "$group":{
"_id": "$country",
"maxQuantity": { "$max": "$quantity" },
"docs": { "$push": {
"_id": "$_id",
"name": "$name",
"quantity": "$quantity"
}}
}},
{ "$project": {
"maxQuantity": 1,
"docs": {
"$setDifference": [
{ "$map": {
"input": "$docs",
"as": "doc",
"in": {
"$cond": [
{ "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
"$$doc",
false
]
}
}},
[false]
]
}
}}
])
Så du gemmer alt i et array og tester derefter hvert array-medlem for at se, om dets værdi matcher den, der blev registreret som maksimum, og kasserer alle, der ikke gør det.
Jeg ville beholde _id
værdier i array-dokumenterne, da det er det, der gør dem "unikke" og ikke vil blive negativt påvirket af $setDifference
ved filtrering af værdier. Men hvis "navn" altid er unikt, er det selvfølgelig ikke påkrævet.
Du kan også bare returnere de felter, du ønsker, fra $map
, men jeg returnerer bare hele dokumentet for eksempel.
Husk, at dette har begrænsningen til ikke at overskride BSON-størrelsesgrænsen på 16 MB, så det er okay for små dataeksempler, men alt, der producerer en potentielt stor liste (da du ikke kan forfiltrere matrixindhold) ville være bedre at behandle med en separat forespørgsel for at finde "max" værdierne, og en anden for at hente de matchende dokumenter.