Ако искате да запазите информация за документа, тогава основно трябва да $push
го в масив. Но, разбира се, тогава разполагате с вашия $maxкод>
стойности, трябва да филтрирате съдържанието на масива само за елементите, които съответстват:
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]
]
}
}}
])
Така че съхранявате всичко в масив и след това тествате всеки член на масива, за да видите дали неговата стойност съвпада с тази, която е записана като максимална, като отхвърляте всички, които не съвпадат.
Бих запазил _id
стойности в документите на масива, тъй като това ги прави „уникални“ и няма да бъдат повлияни неблагоприятно от $setDifference
при филтриране на стойности. Но, разбира се, ако „име“ винаги е уникално, то няма да се изисква.
Можете също така просто да върнете каквито полета искате от $mapкод>
, но просто връщам целия документ например.
Имайте предвид, че това има ограничението да не надвишава ограничението за размер на BSON от 16MB, така че е добре за малки извадки от данни, но всичко, което създава потенциално голям списък (тъй като не можете предварително да филтрирате съдържанието на масива), би било по-добре да се обработи с отделна заявка за намиране на „максималните“ стойности и друга за извличане на съответстващите документи.