MongoDB 3.6 और नए के लिए:
$expr
ऑपरेटर क्वेरी भाषा के भीतर एकत्रीकरण अभिव्यक्तियों के उपयोग की अनुमति देता है, इस प्रकार आप $strLenCP
के उपयोग का लाभ उठा सकते हैं स्ट्रिंग की लंबाई की जाँच करने के लिए ऑपरेटर इस प्रकार है:
db.usercollection.find({
"name": { "$exists": true },
"$expr": { "$gt": [ { "$strLenCP": "$name" }, 40 ] }
})
MongoDB 3.4 और नए के लिए:
आप एग्रीगेशन फ्रेमवर्क का उपयोग $redact
. के साथ भी कर सकते हैं पाइपलाइन ऑपरेटर जो आपको $cond
. के साथ तार्किक स्थिति को संसाधित करने की अनुमति देता है ऑपरेटर और विशेष संचालन का उपयोग करता है $$KEEP
दस्तावेज़ को "रखने" के लिए जहाँ तार्किक स्थिति सही है या $$PRUNE
उस दस्तावेज़ को "निकालने" के लिए जहां शर्त गलत थी।
यह ऑपरेशन $project
. के समान है पाइपलाइन जो संग्रह में फ़ील्ड का चयन करती है और एक नया फ़ील्ड बनाती है जो तार्किक स्थिति क्वेरी से परिणाम रखती है और उसके बाद $match
, सिवाय इसके कि $redact
एकल पाइपलाइन चरण का उपयोग करता है जो अधिक कुशल है।
तार्किक स्थिति के लिए, स्ट्रिंग एग्रीगेशन ऑपरेटर्स हैं जिनका आप उपयोग कर सकते हैं $strLenCP
स्ट्रिंग की लंबाई की जांच करने के लिए ऑपरेटर। अगर लंबाई $gt
है एक निर्दिष्ट मान, तो यह एक सही मिलान है और दस्तावेज़ "रखा" है। अन्यथा इसे "काटा" और त्याग दिया जाता है।
निम्नलिखित समग्र संचालन को चलाने पर विचार करें जो उपरोक्त अवधारणा को प्रदर्शित करता है:
db.usercollection.aggregate([
{ "$match": { "name": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$gt": [ { "$strLenCP": "$name" }, 40] },
"$$KEEP",
"$$PRUNE"
]
}
},
{ "$limit": 2 }
])
अगर $where
का उपयोग कर रहे हैं , संलग्न कोष्ठक के बिना अपनी क्वेरी का प्रयास करें:
db.usercollection.find({$where: "this.name.length > 40"}).limit(2);
फ़ील्ड के अस्तित्व की जांच करना और फिर लंबाई की जांच करना एक बेहतर प्रश्न होगा:
db.usercollection.find({name: {$type: 2}, $where: "this.name.length > 40"}).limit(2);
या:
db.usercollection.find({name: {$exists: true}, $where: "this.name.length >
40"}).limit(2);
MongoDB गैर-$where
. का मूल्यांकन करता है $where
. से पहले क्वेरी संचालन भाव और गैर-$where
क्वेरी स्टेटमेंट एक इंडेक्स का उपयोग कर सकते हैं। स्ट्रिंग की लंबाई को किसी अन्य फ़ील्ड के रूप में संग्रहीत करना एक बेहतर प्रदर्शन है और फिर आप इसे इंडेक्स या खोज सकते हैं; $where
applying लागू करना की तुलना में बहुत धीमा होगा। JavaScript अभिव्यक्तियों और $where
. का उपयोग करने की अनुशंसा की जाती है जब आप किसी अन्य तरीके से डेटा की संरचना नहीं कर सकते हैं, या जब आप डेटा के एक छोटे से सबसेट के साथ काम कर रहे हैं, तो एक अंतिम उपाय के रूप में ऑपरेटर।
एक अलग और तेज़ तरीका जो $where
. के उपयोग से बचा जाता है ऑपरेटर $regex
है ऑपरेटर। निम्नलिखित पैटर्न पर विचार करें जो
db.usercollection.find({"name": {"$type": 2, "$regex": /^.{41,}$/}}).limit(2);
नोट - दस्तावेज़ों . से :
<ब्लॉकक्वॉट>यदि फ़ील्ड के लिए कोई अनुक्रमणिका मौजूद है, तो MongoDB अनुक्रमणिका में मानों के विरुद्ध नियमित अभिव्यक्ति से मेल खाता है, जो एक संग्रह स्कैन से तेज़ हो सकता है। आगे अनुकूलन तब हो सकता है जब नियमित अभिव्यक्ति एक "उपसर्ग अभिव्यक्ति" है, जिसका अर्थ है कि सभी संभावित मिलान एक ही स्ट्रिंग से शुरू होते हैं। यह MongoDB को उस उपसर्ग से एक "श्रेणी" बनाने की अनुमति देता है और केवल उस सीमा के भीतर आने वाले सूचकांक के उन मानों से मेल खाता है।
एक रेगुलर एक्सप्रेशन एक "उपसर्ग अभिव्यक्ति" है यदि यह acaret से शुरू होता है (^)
या एक बायां एंकर (\A)
, सरल प्रतीकों की एक स्ट्रिंग के बाद। उदाहरण के लिए, रेगेक्स /^abc.*/
केवल abc
. से शुरू होने वाले अनुक्रमणिका के मानों के विरुद्ध मिलान करके अनुकूलित किया जाएगा ।
इसके अतिरिक्त, जबकि /^a/, /^a.*/,
और /^a.*$/
समकक्षस्ट्रिंग से मेल खाते हैं, उनके पास अलग-अलग प्रदर्शन विशेषताएं हैं। यदि उपयुक्त अनुक्रमणिका मौजूद है तो ये सभी अभिव्यक्तियाँ एक अनुक्रमणिका का उपयोग करती हैं; हालांकि,/^a.*/
, और /^a.*$/
धीमे हैं। /^a/
उपसर्ग का मिलान करने के बाद स्कैन करना बंद कर सकता है।