Pokud si chcete uchovat informace o dokumentu, pak v podstatě potřebujete $push
to do pole. Ale samozřejmě, pak mít svůj $max
hodnoty, musíte filtrovat obsah pole pouze pro prvky, které se shodují:
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]
]
}
}}
])
Takže vše uložíte do pole a poté otestujete každý člen pole, abyste zjistili, zda se jeho hodnota shoduje s hodnotou, která byla zaznamenána jako maximální, a vyřadíte všechny, které tomu tak nejsou.
Ponechal bych _id
hodnoty v dokumentech pole, protože to je dělá "jedinečnými" a nebudou nepříznivě ovlivněny $setDifference
při filtrování hodnot. Ale samozřejmě, pokud je "jméno" vždy jedinečné, pak to nebude vyžadováno.
Můžete také vrátit jakákoli pole, která chcete, z $map
, ale například vracím celý dokument.
Mějte na paměti, že to má omezení spočívající v nepřekročení limitu velikosti BSON 16 MB, takže je v pořádku pro malé vzorky dat, ale cokoli vytvářející potenciálně velký seznam (protože nemůžete předfiltrovat obsah pole) by bylo lepší zpracovat pomocí samostatný dotaz pro nalezení hodnot "max" a další pro načtení odpovídajících dokumentů.