2015-06-19 5 views
6

Ich habe ein sehr lästiges Problem mit einer Groß-und Kleinschreibung Abfrage auf Mongodb.MongoDB case insensitive Abfrage von Text mit Klammern

Ich verwende MongoTemplate in einer Webanwendung und ich muss case-insensitive Abfragen für eine Auflistung ausführen.

mit diesem Code

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); 

ich die folgende Abfrage

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

schaffen, die perfekt funktioniert, wenn ich einfach Text, zum Beispiel:

Capitella capitata

aber ... aber ... wenn t Hier sind Klammer() die Abfrage funktioniert nicht. Es ist überhaupt nicht arbeiten, auch die Abfrage Text geschrieben ist in dem Dokument ... Beispiel geschrieben wird:

Abfrage 1:

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

Abfrage 2:

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

Abfrage 3:

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

Also ... mache ich etwas falsch? Ich habe vergessen, einige Pattern.SOME in die Pattern.compile() aufzunehmen? Irgendeine Lösungsmöglichkeit?

Dank

------ ------ UPDATE

Die Antwort von user3561036 mir Figur geholfen, wie die Abfrage erstellt werden muss.

So habe ich durch Modifizieren der Erstellung von Abfragen in

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

Der Ausgang Abfrage

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

funktioniert.

+0

Warum haben Sie 'u' (" $ options ":" iu ") in Optionen verwendet? – Vishnu

Antwort

2

Wenn Sie den Operator $regex mit einem "String" als Eingabe verwenden, müssen Literale für reservierte Zeichen wie () angegeben werden.

Normalerweise ist das eine einzige \, aber da es in einem String ist bereits Sie es tun zweimal \\:

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

Gut, Antwort ...Es gab mir die Eingabe, um das Problem mit zu beheben: 'Query q = new Query(); q.addCriteria (Kriterien.where ("myField") .regex (Pattern.compile (Pattern.quote (myFieldValue), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); ' , die mir den Ausgang Abfrage geben: '{ "scientificName": { "$ regex": "\\ Qhaliclona (rhizoniera) sarai \\ E", "$ options": "iu"}}' die funktioniert. – dgiaig

+0

@dgiaig Nun, es sollte darauf hingewiesen werden, denn so funktioniert das Kompilieren mit Strings. Die Methode hier ist Overkill, da nur Zeichen wie '()' reserviert sind, wie ich sagte. Es ist eine Regex Frage im Herzen. Vergessen Sie nicht, Ihre Antworten zu akzeptieren (http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow). –

+0

Fertig..Danke, Mann! – dgiaig

0

Verwenden $ strcasecmp. Das Aggregations-Framework wurde in MongoDB 2.2 eingeführt. Sie können den String-Operator "$ strcasecmp" verwenden, um einen Vergleich zwischen Strings ohne Berücksichtigung der Groß- und Kleinschreibung vorzunehmen. Es ist mehr empfohlen und einfacher als die Verwendung von Regex.