2016-04-15 30 views
5

Vorrei effettuare una ricerca su una raccolta nel mio database mongodb. Nella mia collezione, ho i documenti con il campo "Nome" può essere valori come:MongoDB: come trovare i documenti che ignorano la distinzione tra maiuscole e minuscole, gli accenti e la percentuale come logica (%)

[i] "Palácio Guanabara", "Palácio da Cidade", "Festa Palácio", ecc

Quando un utente digita una ricerca come "pala" o "palá" o "Pala" o "PalÁ", tutti quelli itens in [i] devono creare il set di risultati.

ho scoperto che in MongoDB potrei usare espressioni regolari nelle ricerche, come:

{ "name": { $regex: new Regex(".*pala.*", "i") } } 

Ok, questo approccio è case insensitive e utilizzare la percentuale come la logica da SQL ("% pala%"). Ma, non è da ignorare gli accenti dal registro nel database.

ho trovato un'altra alternativa con l'indice $ testo: https://docs.mongodb.org/manual/core/index-text/

Questo approccio può ignorare maiuscole e minuscole e accenti. Ma la "ricerca" non accetta una regex, quindi non posso cercare cose come "% pala%".

Riassumendo, voglio fare la seguente query SQL in MongoDB:

select * from collection where remove_accents(upper(name)) like '%Pala%' 

E questa query restituire i risultati con nome come "Palácio", "palacio", "palacio", ecc

+1

Come suggerito qui http: // StackOverflow.it/questions/7707671/mongodb-match-accentented-character-as-underlying-character la tua scommessa migliore è quella di creare un campo con una versione non accentata della tua stringa ricercabile. – joao

+0

Grazie a @joao. Userò l'approccio Dmitriy e in futuro creerò questo file "ricercabile". –

risposta

1

Qui non c'è alcun punto magico all'interno di MongoDb. Ma dal momento che ovviamente modifichi l'input dell'utente per creare '% pala%', perché non sostituire "a" con "[aá]" e inserire ". *", In questo modo puoi usare regex e avere i tuoi segni diacritici.

Qui ci sono opzioni non molto lavoro per creare sostituzioni.

francesi lettere [a-zA-ZàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒ]

Lettere tedesche La lettera controversa capitale per SS, ora incluso in Unicode, che manca in molti tipi di carattere, quindi potrebbe mostrare sul vostro schermo come un punto interrogativo . [a-zA-ZäöüßÄÖÜẞ]

lettere polacchi [a-pr-uwy-zA-PR-UWY-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ] Si noti che non v'è alcuna Q, V e X in polacco. Ma se si vuole consentire a tutti lettere inglesi così, usare [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]

Lettere italiane [a-zA-ZàèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]

spagnoli lettere [a-zA-ZáéíñóúüÁÉÍÑÓÚÜ] da http://www.rexegg.com/regex-interesting-character-classes.html#languages

+0

Grazie per l'aiuto. In questo momento, userò questo approccio per risolvere il mio problema. Funziona, ho usato questa utile funzione in questo [post] (http://stackoverflow.com/a/5700735/6209115) –

8

quello che è successo, se si utilizza solo:

find({name: {$regex: 'pala', $options: "i"}}) 

voi utilizzato new Regex() che potrebbe non valido costruttore costruttore valido è new RegExp()