410 Stimmen

MongoDB: Ist es möglich, eine Abfrage ohne Berücksichtigung der Groß-/Kleinschreibung zu erstellen?

Beispiel:

> db.stuff.save({"foo":"bar"});

> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0

46voto

Nilesh Punkte 1924
db.company_profile.find({ "companyName" : { "$regex" : "Nilesh" , "$options" : "i"}});

23voto

vijay Punkte 8853

TL;DR

Die korrekte Vorgehensweise in Mongo

Nicht verwenden RegExp

Gehen Sie natürlich und verwenden Sie die eingebaute Indizierung von Mongodb, Suche

Schritt 1 :

db.articles.insert(
   [
     { _id: 1, subject: "coffee", author: "xyz", views: 50 },
     { _id: 2, subject: "Coffee Shopping", author: "efg", views: 5 },
     { _id: 3, subject: "Baking a cake", author: "abc", views: 90  },
     { _id: 4, subject: "baking", author: "xyz", views: 100 },
     { _id: 5, subject: "Café Con Leche", author: "abc", views: 200 },
     { _id: 6, subject: "", author: "jkl", views: 80 },
     { _id: 7, subject: "coffee and cream", author: "efg", views: 10 },
     { _id: 8, subject: "Cafe con Leche", author: "xyz", views: 10 }
   ]
)

Schritt 2 :

Erforderlich ist die Erstellung eines Indexes für den jeweiligen TEXT Feld, in dem Sie suchen möchten, ohne Indexierung wird die Abfrage extrem langsam sein

db.articles.createIndex( { subject: "text" } )

Schritt 3 :

db.articles.find( { $text: { $search: "coffee",$caseSensitive :true } } )  //FOR SENSITIVITY
db.articles.find( { $text: { $search: "coffee",$caseSensitive :false } } ) //FOR INSENSITIVITY

23voto

rshivamca Punkte 229
db.zipcodes.find({city : "NEW YORK"}); // Case-sensitive
db.zipcodes.find({city : /NEW york/i}); // Note the 'i' flag for case-insensitivity

11voto

Nick Kamer Punkte 91

Eine sehr wichtige Sache zu beachten, wenn Sie eine Regex-basierte Abfrage verwenden - Wenn Sie dies für ein Login-System tun, jedes einzelne Zeichen vermeiden nach dem Sie suchen, und vergessen Sie nicht die Operatoren ^ und $. Lodash hat eine nette Funktion für dies falls Sie es bereits verwenden:

db.stuff.find({$regex: new RegExp(_.escapeRegExp(bar), $options: 'i'})

Und warum? Stellen Sie sich vor, ein Benutzer gibt ein .* als seinen Benutzernamen. Das würde mit allen Benutzernamen übereinstimmen und eine Anmeldung durch einfaches Erraten des Kennworts eines beliebigen Benutzers ermöglichen.

9voto

David Ortiz Punkte 957

Für die Suche nach einer Variablen und deren Unterdrückung:

const escapeStringRegexp = require('escape-string-regexp')
const name = 'foo'
db.stuff.find({name: new RegExp('^' + escapeStringRegexp(name) + '$', 'i')})   

Das Escapen der Variable schützt die Abfrage vor Angriffen mit '.*' oder anderen Regex.

escape-string-regexp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X