ドキュメント情報を保持したい場合は、基本的に $ 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<から必要なフィールドを返すこともできます。 / code>
、しかし、たとえば、ドキュメント全体を返すだけです。
これにはBSONサイズの制限である16MBを超えないという制限があるため、小さなデータサンプルでも問題ありませんが、(配列コンテンツを事前にフィルタリングできないため)潜在的に大きなリストを生成するものは、 「最大」値を見つけるための別のクエリと、一致するドキュメントをフェッチするための別のクエリ。