Jeśli chcesz zachować informacje o dokumencie, zasadniczo musisz $push
go w tablicę. Ale oczywiście, wtedy masz swój $max
wartości, musisz filtrować zawartość tablicy tylko dla pasujących elementów:
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]
]
}
}}
])
Więc przechowujesz wszystko w tablicy, a następnie testujesz każdy element tablicy, aby sprawdzić, czy jego wartość odpowiada tej, która została zarejestrowana jako maksymalna, odrzucając te, które nie pasują.
Zachowałbym _id
wartości w dokumentach tablicowych, ponieważ to sprawia, że są one „unikalne” i nie będą miały na nie negatywnego wpływu $setDifference
podczas filtrowania wartości. Ale oczywiście, jeśli "nazwa" jest zawsze unikalna, nie będzie wymagana.
Możesz także po prostu zwrócić dowolne pola z $map
, ale na przykład zwracam tylko cały dokument.
Należy pamiętać, że ma to ograniczenie do nieprzekraczania limitu rozmiaru BSON wynoszącego 16 MB, więc jest w porządku dla małych próbek danych, ale wszystko, co tworzy potencjalnie dużą listę (ponieważ nie można wstępnie filtrować zawartości tablicy) byłoby lepiej przetworzone za pomocą oddzielne zapytanie, aby znaleźć wartości „max”, a drugie, aby pobrać pasujące dokumenty.