समझने के लिए यहां कुछ कैच हैं।
जब आप $group
का इस्तेमाल करते हैं
सीमाओं को इस क्रम में क्रमबद्ध किया जाएगा कि उन्हें प्रारंभिक या समाप्ति चरण के बिना खोजा गया था $सॉर्ट करें
संचालन। तो अगर आपके दस्तावेज़ मूल रूप से इस तरह के क्रम में थे:
{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
फिर बस $group
का इस्तेमाल करके
बिना $sort
अंत में पाइपलाइन पर आपको इस तरह के परिणाम लौटाएगा:
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
यह एक अवधारणा है, लेकिन वास्तव में ऐसा लगता है कि आप परिणामों में जो उम्मीद कर रहे हैं, उसे uid
के क्रमबद्ध क्रम से "अंतिम अन्य फ़ील्ड" वापस करने की आवश्यकता है आप जो खोज रहे हैं वह है। उस स्थिति में आपका परिणाम प्राप्त करने का तरीका वास्तव में $sort
. है पहले और फिर $last<का उपयोग करें /कोड>
ऑपरेटर:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"created": { "$last": "$created" },
"another_col": { "$last": "$created" }
}}
])
या अनिवार्य रूप से आप जो चाहते हैं उस पर सॉर्ट लागू करें।
$last
के बीच अंतर
और $max
यह है कि बाद वाला समूह _id
के भीतर दिए गए फ़ील्ड के लिए "उच्चतम" मान का चयन करेगा , अन-सॉर्टेड ऑर्डर पर वर्तमान सॉर्ट किए गए की परवाह किए बिना। दूसरी ओर, $last
"अंतिम" समूह के समान "पंक्ति" में होने वाले मान को चुनेंगे _id
मूल्य।
यदि आप वास्तव में किसी सरणी के मानों को क्रमबद्ध करना चाह रहे थे तो दृष्टिकोण समान है। सरणी सदस्यों को "बनाए गए" क्रम में रखते हुए आप पहले भी क्रमबद्ध करेंगे:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"row": {
"$push": {
"created": "$created",
"another_col": "$another_col"
}
}
}}
])
और उन फ़ील्ड वाले दस्तावेज़ों को सरणी में उसी क्रम में जोड़ दिया जाएगा जिस क्रम से वे पहले से क्रमबद्ध थे।