$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 बाइट्स (स्ट्रिंग पेलोड और एक छोटा फ़ील्ड नाम) नगण्य है।