MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

mongoDB में स्ट्रिंग फ़ील्ड मान लंबाई

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/ उपसर्ग का मिलान करने के बाद स्कैन करना बंद कर सकता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. स्प्रिंग डेटा में मोंगो एकत्रीकरण क्वेरी कैसे करें?

  2. ऑब्जेक्ट आईडी बनाने की कोशिश में उल्का अमान्य हेक्साडेसिमल स्ट्रिंग त्रुटि देता है?

  3. PyMongo लेनदेन त्रुटि:लेन-देन संख्या केवल एक प्रतिकृति सेट सदस्य या mongos पर अनुमति दी जाती है

  4. MongoDB में पूर्ण-पाठ खोज कैसे करें

  5. MongoDB diacriticInSensitive खोज अपेक्षित और इसके विपरीत सभी उच्चारण (विशेषक चिह्न वाले शब्द) पंक्तियों को नहीं दिखा रहा है