2011-11-23 15 views
27

Sto utilizzando una ricerca senza distinzione tra maiuscole e minuscole in Mongo, qualcosa di simile a https://stackoverflow.com/q/5500823/1028488.Ricerca senza distinzione tra maiuscole e minuscole in Mongo

ie Sto usando una regex con le opzioni i. Ma sto sto avendo difficoltà limitando l'espressione regolare a proprio quella parola, i suoi esegue più come un 'Like' in SQL

esempio: se io uso domanda come {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, mostra i risultati per vincere, la finestra & inverno. Come faccio a limitarlo a jsut show win?

Ho provato /^win$/ ma il suo sayin invalid Json .... Si prega di suggerire un modo.

Grazie in anticipo

risposta

17

UPDATE: Come di MongoDB 2.4 si potrebbe usare un indice "testo" e query di ricerca full text per fare ciò. Puoi leggere su di loro here. Se si utilizza un recente MongoDB, l'approccio sotto sarebbe sciocco e non necessario.

Tuttavia, se si dispone di MongoDB < 2.4.0 si potrebbe usare un'espressione regolare in questo modo:

> db.reg.insert({searchword: "win"}) 
> db.reg.insert({searchword: "window"}) 
> db.reg.insert({searchword: "Win"}) 

> db.reg.find() 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e36dd68c9021e453d13"), "searchword" : "window" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

> db.reg.find({ searchword: /^win$/i }) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

Tuttavia, la versione non funzionava perché non è necessario il "/" s quando utilizzando l'operatore di $ regex:

> db.reg.find({ searchword: { $regex: "^win$", $options: '-i' }}) 
{ "_id" : ObjectId("4ecd2e33dd68c9021e453d12"), "searchword" : "win" } 
{ "_id" : ObjectId("4ecd2e39dd68c9021e453d14"), "searchword" : "Win" } 

prega di notare che le query caso insensibili non utilizzare l'indice in modo che potrebbe avere senso per fare un campo Searchword minuscolo in modo da poter accelerare quella query su.

Go here per più informazioni RegularExpressions

+1

$ text non è un sostituto per regex. È piuttosto restrittivo e non gli permetterebbe di trovare "inverno" con una ricerca di "vittoria". –

+0

@BT Hai ragione. Per fare ciò bisognerebbe immagazzinare n-grammi e abbinarli a quelli. [Ricerca fuzzy con MongoDB e Python] (https://medium.com/xeneta/fuzzy-search-with-mongodb-and-python-57103928ee5d#.yg7f3428b) – Rohmer

+0

Inoltre: [Case Insensitive Indexes] (https: // docs .mongodb.com/manual/core/index-case-insensitive /) – Rohmer

-1

Per il caso insensitive db.users.find ({ "nome": {$ regex: new RegExp ("Vi", "i")}})

Per il caso di sensibile db.users.find ({ "name": "Vi"}) o db.users.find ({ "e-mail": "[email protected]"})

di ricerca nella tabella utente

nome è co nome della colonna e testo "Vi" ricercati

57

È possibile utilizzare $options => i per la ricerca non sensibile al maiuscolo/minuscolo. Fornire alcuni possibili esempi necessari per la corrispondenza delle stringhe.

caso esatta insensitive string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}}) 

Contiene string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}}) 

Inizia con string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}}) 

End con string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}}) 

Non contiene string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}}) 

Tenere questo come un segnalibro, e un punto di riferimento per tutte le altre modifiche potrebbe essere necessario. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Per errore, hai inserito l'esempio di "Contains string" all'interno di "Exact case insensitive string" e viceversa. Ho modificato la tua risposta scambiando gli esempi per questi due casi e corretto anche alcuni errori grammaticali. – gauravparmar

+0

@gauravparmar: Si prega di verificare e correggere se qualcosa non è corretto. –

+0

Ho modificato la tua risposta ma deve essere sottoposta a peer-review, dice. – gauravparmar

0

Utilizzare $ strcasecmp. Il quadro 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 di espressioni regolari.

Ecco il documento ufficiale sull'operatore di comando di aggregazione: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp.

Problemi correlati