यदि आप दस्तावेज़ की जानकारी रखना चाहते हैं, तो आपको मूल रूप से की आवश्यकता होगी। $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
, लेकिन उदाहरण के लिए मैं अभी पूरा दस्तावेज़ लौटा रहा हूँ।
ध्यान रखें कि इसमें 16 एमबी की बीएसओएन आकार सीमा से अधिक नहीं होने की सीमा है, इसलिए छोटे डेटा नमूने के लिए ठीक है, लेकिन संभावित रूप से बड़ी सूची बनाने वाली कोई भी चीज़ (चूंकि आप सरणी सामग्री को पूर्व-फ़िल्टर नहीं कर सकते हैं) एक के साथ संसाधित होने के लिए बेहतर होगा अलग क्वेरी "अधिकतम" मान खोजने के लिए, और दूसरा मिलान दस्तावेज़ लाने के लिए।