2015-06-19 8 views
6

Ho un problema molto fastidioso con una query maiuscole/minuscole su mongodb.query MongoDB non sensibile al maiuscolo/minuscolo sul testo con parentesi

Sto utilizzando MongoTemplate in un'applicazione Web e ho bisogno di eseguire query maiuscole e minuscole su una raccolta.

con questo codice

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

ho creare la seguente query

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

che funziona perfettamente quando ho di testo semplice, ad esempio:

Capitella capitata

ma ... ma ... quando t ecco la parentesi () la query non funziona. Non funziona affatto, anche il testo della query è scritto, come è scritto nel documento ... Esempio:

interrogazione 1:

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

interrogazione 2:

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

query 3:

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

Quindi ... sto facendo qualcosa di sbagliato? Ho dimenticato alcuni Pattern. Alcuni da includere nel Pattern.compile()? Qualche soluzione?

Grazie

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

La risposta di user3561036 mi ha aiutato a capire come la query deve essere costruito.

Così, ho risolto modificando la costruzione di query nella query

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

L'uscita

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

opere.

+0

perché hai usato 'u' (" $ opzioni ":" iu ") nelle opzioni? – Vishnu

risposta

2

Se si utilizza l'operatore $regex con una "stringa" come input, è necessario inserire valori letterali per i caratteri riservati come ().

Normalmente questo è un singolo \, ma dal momento che è in una stringa già farlo due volte \\:

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

Buono, rispondi ...Mi ha dato l'input per risolvere il problema con: 'Query q = new Query(); q.addCriteria (Criteria.where ("myField") .regex (Pattern.compile (Pattern.quote (myFieldValue), Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE))); ' che mi danno la query di uscita: '{ "scientificName": { "$ regex": "\\ Qhaliclona (rhizoniera) Sarai \\ E", "$ options": "iu"}}' che lavori. – dgiaig

+0

@dgiaig Beh, avrebbe dovuto indicare perché è così che funziona con le stringhe. Il metodo qui è eccessivo dato che solo i caratteri come '()' sono riservati come ho detto. È una domanda regex a cuore. Non dimenticare di [accettare] (http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow) le tue risposte. –

+0

Fatto..Grazie uomo! – dgiaig

0

Usa $ strcasecmp. Il framework di aggregazione è stato introdotto in MongoDB 2.2. È possibile utilizzare l'operatore di stringa "$ strcasecmp" per eseguire un confronto senza distinzione tra maiuscole e minuscole tra stringhe. È più raccomandato e più semplice rispetto all'utilizzo della regex.

Problemi correlati