Si vous souhaitez conserver les informations du document, vous devez essentiellement $push
dans un tableau. Mais bien sûr, avoir alors votre $max
valeurs, vous devez filtrer le contenu du tableau uniquement pour les éléments qui correspondent :
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]
]
}
}}
])
Donc, vous stockez tout dans un tableau, puis testez chaque membre du tableau pour voir si sa valeur correspond à celle qui a été enregistrée comme maximum, en supprimant ceux qui ne le font pas.
Je garderais le _id
valeurs dans les documents du tableau puisque c'est ce qui les rend "uniques" et ne sera pas affecté par $setDifference
lors du filtrage des valeurs. Mais bien sûr, si "nom" est toujours unique, il ne sera pas obligatoire.
Vous pouvez également simplement renvoyer les champs de votre choix à partir de $map
, mais je ne fais que renvoyer le document entier par exemple.
Gardez à l'esprit que cela a la limitation de ne pas dépasser la limite de taille BSON de 16 Mo, donc c'est correct pour les petits échantillons de données, mais tout ce qui produit une liste potentiellement grande (puisque vous ne pouvez pas pré-filtrer le contenu du tableau) serait mieux traité avec un une requête séparée pour trouver les valeurs "max" et une autre pour récupérer les documents correspondants.