2015-06-19 4 views
6

मुझे मोंगोड पर केस असंवेदनशील क्वेरी के साथ एक बहुत ही परेशानी की समस्या है।मोंगोडीबी केस कोष्ठक के साथ पाठ पर असंवेदनशील क्वेरी

मैं एक वेब एप्लिकेशन में MongoTemplate का उपयोग कर रहा हूं और मुझे संग्रह पर केस असंवेदनशील प्रश्न निष्पादित करने की आवश्यकता है।

caPITella capitata

:

इस कोड

Query q = new Query(); 
q.addCriteria(Criteria.where("myField") 
.regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); 
return mongoTemplate.findOne(q,MyClass.class); 

मैं निम्न क्वेरी

{ "myField" : { "$regex" : "field value" , "$options" : "iu"}} 

कि पूरी तरह से काम करता है जब मैं साधारण पाठ है, उदाहरण के लिए बनाने के साथ

लेकिन ... लेकिन ... जब टी यहां कोष्ठक() क्वेरी काम नहीं करता है। यह बिल्कुल भी काम नहीं करता है, यहां तक ​​कि क्वेरी पाठ के रूप में दस्तावेज़ में लिखा है लिखा है ... उदाहरण:

क्वेरी 1:

{"myField" : "Ceratonereis (Composetia) costae" } -> 1 result (ok) 

क्वेरी 2:

{ "myField" : { 
    "$regex" : "Ceratonereis (Composetia) costae" , 
    "$options" : "iu" 
}} -> no results (not ok) 

प्रश्न 3:

{ "scientificName" : { 
    "$regex" : "ceratonereis (composetia) costae" , 
    "$options" : "iu" 
}} -> no results (....) 

तो ... मैं कुछ गलत कर रहा हूं? मैं Pattern.compile() में शामिल करने के लिए कुछ पैटर्न भूल गया। कोई भी समाधान?

धन्यवाद

------ अद्यतन ------

user3561036 का जवाब मुझे लगाने की कैसे क्वेरी बनाया जाना चाहिए मदद की।

तो, मैं

q.addCriteria(Criteria.where("myField") 
.regex(Pattern.compile(Pattern.quote(myFieldValue), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); 

उत्पादन क्वेरी

{ "myField" : { "$regex" : "\\Qhaliclona (rhizoniera) sarai\\E" , "$options" : "iu"}} 

कार्यों में क्वेरी इमारत को संशोधित करके सुलझा ली है।

+0

आपने विकल्पों में 'u' (" $ विकल्प ":" iu ") का उपयोग क्यों किया? – Vishnu

उत्तर

2

यदि इनपुट के रूप में "स्ट्रिंग" के साथ $regex ऑपरेटर का उपयोग करना है तो आपको () जैसे आरक्षित अक्षरों के लिए अक्षर उद्धृत करना होगा।

आम तौर पर है कि एक ही \ है, लेकिन क्योंकि यह एक स्ट्रिंग में है पहले से ही आप इसे दो बार \\ कार्य करें:

{ "myField" : { 
    "$regex" : "Ceratonereis \\(Composetia\\) costae" , 
    "$options" : "iu" 
}} 
+0

अच्छा, जवाब ...इसने मुझे इस मुद्दे को हल करने के लिए इनपुट दिया: 'क्वेरी q = नई क्वेरी(); q.addCriteria (मानदंड। कहीं ("myField") .regex (Pattern.compile (पैटर्न .quote (myFieldValue), पैटर्न। CASE_INSENSITIVE | पैटर्न .UNICODE_CASE))); ' कि मुझे उत्पादन क्वेरी दे: ' { "scientificName": { "$ रेगुलर एक्सप्रेशन": "\\ Qhaliclona (rhizoniera) सराय \\ ई", "$ विकल्प": "आइयू"}} ' जो काम करता है। – dgiaig

+0

@dgiaig वैसे यह ध्यान देना चाहिए क्योंकि तारों के साथ संकलन कैसे किया जाता है। यहां दी गई विधि अधिक है क्योंकि मैंने कहा था कि केवल (जैसे 'जैसे आरएआर आरक्षित हैं। यह दिल में एक रेगेक्स सवाल है। [स्वीकार करें] (http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow) अपने उत्तरों को भूलना न भूलें। –

+0

हो गया..धन्यवाद आदमी! – dgiaig

0

उपयोग $ strcasecmp। मोंगोडीबी 2.2 में एकत्रीकरण ढांचा पेश किया गया था। तारों के बीच केस-असंवेदनशील तुलना करने के लिए आप स्ट्रिंग ऑपरेटर "$ strcasecmp" का उपयोग कर सकते हैं। रेगेक्स का उपयोग करने की तुलना में यह अधिक अनुशंसित और आसान है।

संबंधित मुद्दे