आपको यहाँ जो अर्थ प्रतीत होता है वह यह है कि आप अपने परिणामों को "उत्तर" सरणी की "लंबाई" के आधार पर "क्रमबद्ध" करना चाहते हैं, न कि "लंबाई" नामक "संपत्ति" के आधार पर, जैसा कि आपके वाक्यविन्यास का तात्पर्य है। रिकॉर्ड के लिए, वह सिंटैक्स यहां असंभव होगा क्योंकि आपका मॉडल "संदर्भित" है, जिसका अर्थ है कि इस संग्रह के दस्तावेज़ों में सरणी फ़ील्ड के भीतर मौजूद एकमात्र डेटा ObjectId
है उन संदर्भित दस्तावेजों के मूल्य।
लेकिन आप इसे .aggregate() का उपयोग करके कर सकते हैं।
विधि और $size
ऑपरेटर:
Question.aggregate(
[
{ "$project": {
"title": 1,
"content": 1,
"created": 1,
"updated": 1,
"author": 1,
"answers": 1,
"length": { "$size": "$answers" }
}},
{ "$sort": { "length": -1 } },
{ "$limit": 5 }
],
function(err,results) {
// results in here
}
)
एक एकत्रीकरण पाइपलाइन चरणों में काम करती है। सबसे पहले, एक $project
परिणामों में फ़ील्ड के लिए, जहाँ आप $size
. का उपयोग करते हैं निर्दिष्ट सरणी की लंबाई वापस करने के लिए।
अब "लंबाई" वाला एक क्षेत्र है, आप के साथ चरणों का पालन करें। $सॉर्ट करें
और $limit
जो एक एकत्रीकरण पाइपलाइन के भीतर अपने स्वयं के चरणों के रूप में लागू होते हैं।
दस्तावेज़ के भीतर अपने "उत्तर" सरणी की लंबाई संपत्ति को हमेशा बनाए रखने का एक बेहतर तरीका होगा। इससे अन्य कार्यों के बिना सॉर्ट करना और क्वेरी करना आसान हो जाता है। $incका उपयोग करके इसे बनाए रखना आसान है। कोड>
आप के रूप में ऑपरेटर $push
या $pull
सरणी से आइटम:
Question.findByIdAndUpdate(id,
{
"$push": { "answers": answerId },
"$inc": { "answerLength": 1 }
},
function(err,doc) {
}
)
या हटाते समय उल्टा:
Question.findByIdAndUpdate(id,
{
"$pull": { "answers": answerId },
"$inc": { "answerLength": -1 }
},
function(err,doc) {
}
)
यहां तक कि अगर आप परमाणु ऑपरेटरों का उपयोग नहीं कर रहे हैं, तो वही सिद्धांत लागू होते हैं जहां आप "लंबाई" को अपडेट करते हैं जैसे आप साथ जाते हैं। फिर एक प्रकार से क्वेरी करना सरल है:
Question.find().sort({ "answerLength": -1 }).limit(5).exec(function(err,result) {
});
चूंकि संपत्ति पहले से ही दस्तावेज़ में है।
तो या तो इसे .aggregate()
. के साथ करें अपने डेटा में कोई बदलाव नहीं किए जाने के साथ, या अपने डेटा को बदलने के लिए हमेशा लंबाई को एक संपत्ति के रूप में शामिल करें और आपकी क्वेरी बहुत तेज़ हो जाएंगी।