Jika Anda ingin menyimpan informasi dokumen, pada dasarnya Anda perlu $push
itu menjadi sebuah array. Tapi tentu saja, kemudian memiliki $max
nilai, Anda perlu memfilter konten array hanya untuk elemen yang cocok:
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]
]
}
}}
])
Jadi, Anda menyimpan semuanya dalam sebuah larik dan kemudian menguji setiap anggota larik untuk melihat apakah nilainya cocok dengan nilai maksimum yang tercatat, membuang yang tidak.
Saya akan menyimpan _id
nilai dalam dokumen array karena itulah yang membuatnya "unik" dan tidak akan terpengaruh secara negatif oleh $setDifference
saat menyaring nilai. Tapi tentu saja jika "nama" selalu unik maka tidak diperlukan.
Anda juga dapat mengembalikan bidang apa pun yang Anda inginkan dari $map
, tapi saya hanya mengembalikan seluruh dokumen misalnya.
Perlu diingat bahwa ini memiliki batasan tidak melebihi batas ukuran BSON 16MB, jadi boleh saja untuk sampel data kecil, tetapi apa pun yang menghasilkan daftar yang berpotensi besar (karena Anda tidak dapat memfilter konten array sebelumnya) akan lebih baik diproses dengan kueri terpisah untuk menemukan nilai "maks", dan kueri lainnya untuk mengambil dokumen yang cocok.