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

आंशिक _id स्ट्रिंग का उपयोग करके एक मोंगोडब दस्तावेज़ खोजें

$regex और MongoRegex (अर्थात् एक समानता मिलान में प्रयुक्त BSON रेगेक्स प्रकार) केवल स्ट्रिंग्स के विरुद्ध मिलान का समर्थन करता है, इसलिए आप उन्हें सीधे ObjectId के साथ उपयोग नहीं कर सकते।

अपने पिछले कोड उदाहरण के संबंध में, आपने $where . का उपयोग करने का प्रयास किया एक MongoRegex कंस्ट्रक्टर में:

$searchTermsAny[] = array(
    $dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i',
    '$where: "this._id.toString().match(/'.$sRegex.'/i)"' )
);

MongoRegex का कंस्ट्रक्टर एक स्ट्रिंग लेता है (जैसे /foo/i ), जिससे यह पैटर्न और झंडे प्राप्त करता है। $where शीर्ष-स्तरीय क्वेरी ऑपरेटर के रूप में उपयोग करने का इरादा है (किसी भी फ़ील्ड नाम से संबद्ध नहीं)। $dataProps[$i] . के साथ आप जो कर रहे हैं, मैं उसका पालन नहीं करता , लेकिन मान लीजिए कि आप एक $where . का निर्माण कर रहे थे ऑब्जेक्ट आईडी के स्ट्रिंग प्रतिनिधित्व से मेल खाने के लिए क्वेरी। क्वेरी दस्तावेज़ निम्न जैसा दिखेगा:

{ $where: 'this._id.str.match(/00005/)' }

ध्यान दें कि मैं str . को एक्सेस कर रहा हूं toString() . को लागू करने के बजाय यहां संपत्ति . ऐसा इसलिए है क्योंकि toString() वास्तव में ObjectId का शेल प्रतिनिधित्व लौटाता है। आप इसे शेल में इसके स्रोत की जांच करके देख सकते हैं:

> x = new ObjectId()
ObjectId("5409ddcfd95d6f6a2eb33e7f")
> x.toString
function (){
    return "ObjectId(" + tojson(this.str) + ")";
}

साथ ही, यदि आप केवल यह जांच रहे हैं कि _id . में कोई सबस्ट्रिंग मौजूद है या नहीं हेक्स प्रतिनिधित्व, आप indexOf() (!= -1 . के साथ तुलना) के बजाय match() रेगेक्स के साथ।

उस ने कहा, $where . का उपयोग करते हुए आम तौर पर एक बुरा विचार है यदि आप इसे अतिरिक्त क्वेरी मानदंड के साथ नहीं जोड़ रहे हैं जो कर सकते हैं एक सूचकांक का उपयोग करें। ऐसा इसलिए है क्योंकि $where परिणाम सेट में विचार किए गए प्रत्येक दस्तावेज़ के लिए जावास्क्रिप्ट दुभाषिया को आमंत्रित करता है। यदि आप इसे अन्य, अधिक चयनात्मक मानदंडों के साथ जोड़ते हैं, तो MongoDB एक अनुक्रमणिका का उपयोग कर सकता है और उन दस्तावेज़ों को कम कर सकता है जिनका मूल्यांकन करने के लिए उसे $where के साथ आवश्यकता होती है; हालांकि, यदि आप $where . का उपयोग कर रहे हैं तो आपका समय खराब है और सबसे खराब स्थिति में कई दस्तावेज़ों या टेबल स्कैन को स्कैन करना।

आप शायद प्रत्येक दस्तावेज़ में एक दूसरा फ़ील्ड बनाना बेहतर समझते हैं जिसमें _id की हेक्स स्ट्रिंग प्रस्तुति शामिल है . फिर, आप उस फ़ील्ड को इंडेक्स कर सकते हैं और रेगेक्स का उपयोग करके इसके लिए क्वेरी कर सकते हैं। गैर-एंकर वाली रेगेक्स क्वेरी अभी भी थोड़ी अक्षम होंगी (देखें:रेगेक्स अनुक्रमणिका उपयोग डॉक्स में), लेकिन यह अभी भी $where . का उपयोग करने से कहीं अधिक तेज़ होना चाहिए ।

यह समाधान (_id स्ट्रिंग) प्रति दस्तावेज़ कुछ अतिरिक्त संग्रहण करेगा, लेकिन आप तय कर सकते हैं कि अतिरिक्त 24-30 बाइट्स (स्ट्रिंग पेलोड और एक छोटा फ़ील्ड नाम) नगण्य है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मैं स्प्रिंग-डेटा में मोंगोडब के डिफ़ॉल्ट डेटाबेस को कैसे बदल/परिभाषित कर सकता हूं?

  2. मोंगोडब रूबी देशी ड्राइवर में मैप्रिडस

  3. नेवला:वस्तु के लिए कास्ट मूल्य के लिए विफल रहा

  4. आप MongoDB में ऑटो-इंक्रिमेंटिंग प्राथमिक आईडी कैसे कार्यान्वित करते हैं?

  5. MongoDB पाठ खोज प्रदर्शन में सुधार