Suche ohne Berücksichtigung der Groß- und Kleinschreibung in Mongo

70

Ich verwende in Mongo eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung, ähnlich wie bei https://stackoverflow.com/q/5500823/1028488 .

dh ich benutze einen regulären Ausdruck mit Optionen i. Aber ich habe Probleme, den regulären Ausdruck auf nur dieses Wort zu beschränken. Er funktioniert eher wie ein "Gefällt mir" in SQL

Beispiel: Wenn ich Abfragen wie verwende {"SearchWord" : { '$regex' : 'win', $options: '-i' }}, werden mir Ergebnisse für Gewinn, Fenster und Winter angezeigt. Wie beschränke ich es auf jsut show win?

Ich habe es versucht, /^win$/aber es ist ein ungültiger Json. Bitte schlagen Sie einen Weg vor.

Danke im Voraus

Praneeta
quelle

Antworten:

139

Sie können $options => ifür die Suche ohne Berücksichtigung der Groß- und Kleinschreibung verwenden. Geben Sie einige mögliche Beispiele an, die für die Zeichenfolgenübereinstimmung erforderlich sind.

Genaue Groß- und Kleinschreibung wird nicht berücksichtigt string

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

Enthält string

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

Beginnen mit string

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

Ende mit string

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

Enthält nicht string

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

Bewahren Sie dies als Lesezeichen und als Referenz für andere Änderungen auf, die Sie möglicherweise benötigen. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
quelle
Sie haben versehentlich das Beispiel "Enthält Zeichenfolge" in "Zeichenfolge ohne Berücksichtigung der Groß- und Kleinschreibung" eingefügt und umgekehrt. Ich habe Ihre Antwort bearbeitet, indem ich die Beispiele für diese beiden Fälle ausgetauscht und auch einige grammatikalische Fehler korrigiert habe.
Gauravparmar
@gauravparmar: Bitte überprüfen und korrigieren Sie, wenn etwas nicht stimmt.
Somnath Muluk
Ich habe Ihre Antwort bearbeitet, aber sie muss einer Peer-Review unterzogen werden, heißt es.
Gauravparmar
21

UPDATE : Ab MongoDB 2.4 würde man dazu einen "Text" -Index und eine Volltextsuchabfrage verwenden. Sie können über sie lesen hier . Wenn Sie eine aktuelle MongoDB verwenden, wäre der folgende Ansatz albern und unnötig.

Wenn Sie jedoch MongoDB <2.4.0 haben, können Sie einen regulären Ausdruck wie folgt verwenden:

> 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" }

Ihre Version funktionierte jedoch nicht, da Sie bei Verwendung des Operators $ regex keine "/" benötigen:

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

Beachten Sie, dass bei Abfragen ohne Berücksichtigung der Groß- und Kleinschreibung der Index nicht verwendet wird. Daher ist es möglicherweise sinnvoll, ein Suchwortfeld in Kleinbuchstaben zu erstellen, damit Sie diese Abfrage beschleunigen können.

Gehen Sie hier für weitere Informationen über Regular

Tyler Brock
quelle
2
$ text ist kein Ersatz für Regex. Es ist ziemlich restriktiv und würde ihm nicht erlauben, "Winter" mit der Suche nach "Gewinn" zu finden.
BT
@ BT Du hast recht. Dazu müsste man n-Gramm speichern und auf diese abgleichen. Fuzzy-Suche mit MongoDB und Python
Rohmer
-1

Verwenden Sie $ strcasecmp. Das Aggregationsframework wurde in MongoDB 2.2 eingeführt. Sie können den Zeichenfolgenoperator "$ strcasecmp" verwenden, um einen Vergleich zwischen Zeichenfolgen ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen. Es ist empfehlenswerter und einfacher als die Verwendung von Regex.

Hier ist das offizielle Dokument zum Aggregationsbefehlsoperator: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .

Jogue Wasin
quelle
-1

Für Groß- und Kleinschreibung nicht berücksichtigen

db.users.find({"name":{ $regex : new RegExp("Vi", "i") }})

Für Groß- und Kleinschreibung

db.users.find({"name":"Vi"})
// or
db.users.find({"email":"[email protected]"})

Suche in Benutzertabelle

Name ist Spaltenname und "Vi" -Text, die durchsucht werden

Vikas Kumar
quelle