यदि आप कुछ मानदंडों के अनुसार परिणाम "वजन" करना चाहते हैं या "सॉर्ट" के भीतर किसी भी प्रकार का "गणना मूल्य" है, तो आपको .aggregate()
की आवश्यकता है इसके बजाय विधि। यह "अनुमानित" मानों को $sort
. में उपयोग करने की अनुमति देता है ऑपरेशन, जिसके लिए दस्तावेज़ में केवल एक वर्तमान फ़ील्ड का उपयोग किया जा सकता है:
db.messages.aggregate([
{ "$match": { "messages": userId } },
{ "$project": {
"recipients": 1,
"unread": 1,
"content": 1,
"readYet": {
"$setIsSubset": [ [userId], "$unread" ] }
}
}},
{ "$sort": { "readYet": -1 } },
{ "$limit": 20 }
])
यहां $setIsSubset
ऑपरेटर "अपठित" सरणी की तुलना [userId]
. के परिवर्तित सरणी से करने की अनुमति देता है यह देखने के लिए कि क्या कोई मैच हैं। परिणाम या तो true
होगा जहां userId मौजूद है या false
जहां यह नहीं है।
इसके बाद इसे $sort
. पर पास किया जा सकता है , जो मैचों को वरीयता के साथ परिणामों का आदेश देता है (निर्णायक प्रकार true
. है शीर्ष पर), और अंत में $limit
केवल निर्दिष्ट राशि तक परिणाम लौटाता है।
तो "सॉर्ट" के लिए एक गणना शब्द का उपयोग करने के लिए, मूल्य को दस्तावेज़ में "अनुमानित" करने की आवश्यकता है ताकि इसे सॉर्ट किया जा सके। एकत्रीकरण ढांचा यह है कि आप इसे कैसे करते हैं।
यह भी ध्यान रखें कि $elemMatch
केवल एक सरणी के भीतर एक मान से मेल खाने की आवश्यकता नहीं है, और आपको केवल सीधे मान निर्दिष्ट करने की आवश्यकता है। इसका उद्देश्य यह है कि एक सरणी तत्व पर "एकाधिक" शर्तों को पूरा करने की आवश्यकता होती है, जो निश्चित रूप से यहां लागू नहीं होती है।