Beispiel:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
Beispiel:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
Sie könnten eine regex .
In Ihrem Beispiel wäre das so:
db.stuff.find( { foo: /^bar$/i } );
Ich muss allerdings sagen, dass Sie den Wert vielleicht einfach auf dem Weg dorthin herabsetzen (oder heraufsetzen) könnten, anstatt jedes Mal, wenn Sie ihn finden, die zusätzlichen Kosten zu tragen. Natürlich funktioniert dies nicht für die Namen von Personen und so, aber vielleicht Anwendungsfälle wie Tags.
UPDATEです。
Die ursprüngliche Antwort ist nun überholt. Mongodb unterstützt jetzt eine erweiterte Volltextsuche mit vielen Funktionen.
URSPRÜNGLICHE ANTWORT:
Es sollte beachtet werden, dass die Suche mit regex's case insensitive /i bedeutet, dass mongodb nicht nach Index suchen kann, so dass Abfragen gegen große Datensätze sehr lange dauern können.
Selbst bei kleinen Datenmengen ist das nicht sehr effizient. Sie nehmen einen weitaus größeren Rechenaufwand in Kauf als Ihre Abfrage rechtfertigt, was zu einem Problem werden könnte, wenn Sie versuchen, eine Skalierung zu erreichen.
Als Alternative können Sie eine Kopie in Großbuchstaben speichern und danach suchen. Ich habe zum Beispiel eine Tabelle "Benutzer", die einen Benutzernamen mit gemischter Groß- und Kleinschreibung enthält, aber die ID ist eine Kopie des Benutzernamens in Großbuchstaben. Dadurch wird sichergestellt, dass eine Verdoppelung unter Berücksichtigung der Groß- und Kleinschreibung unmöglich ist (sowohl "Foo" als auch "foo" sind nicht zulässig), und ich kann nach id = username.toUpperCase() suchen, um eine Suche nach dem Benutzernamen ohne Berücksichtigung der Groß- und Kleinschreibung zu erhalten.
Wenn Ihr Feld groß ist, z. B. ein Nachrichtentext, ist das Duplizieren von Daten wahrscheinlich keine gute Option. Ich glaube, die Verwendung eines externen Indexers wie Apache Lucene ist in diesem Fall die beste Option.
Ab MongoDB 3.4 ist die empfohlene Methode zur schnellen Suche ohne Berücksichtigung der Groß-/Kleinschreibung die Verwendung einer Index ohne Berücksichtigung der Groß-/Kleinschreibung .
Ich habe einem der Gründer persönlich eine E-Mail geschickt, damit er dies zum Laufen bringt, und er hat es geschafft! Es war ein Thema auf JIRA seit 2009 und viele haben sich diese Funktion gewünscht. So funktioniert es:
Ein Index, der Groß- und Kleinschreibung nicht berücksichtigt, wird durch die Angabe eines Kollation mit einer Stärke von entweder 1 oder 2. Sie können einen Index ohne Berücksichtigung der Groß- und Kleinschreibung wie folgt erstellen:
db.cities.createIndex(
{ city: 1 },
{
collation: {
locale: 'en',
strength: 2
}
}
);
Sie können auch eine Standardsortierung pro Sammlung angeben, wenn Sie diese erstellen:
db.createCollection('cities', { collation: { locale: 'en', strength: 2 } } );
In beiden Fällen müssen Sie, um den Index ohne Berücksichtigung der Groß- und Kleinschreibung zu verwenden, dieselbe Sortierung in der Datei find
Operation, die bei der Erstellung des Indexes oder der Sammlung verwendet wurde:
db.cities.find(
{ city: 'new york' }
).collation(
{ locale: 'en', strength: 2 }
);
Dies ergibt "New York", "new york", "New york" usw.
Die Antworten, die die Verwendung von Volltextsuche sind falsch in diesem Fall (und potenziell gefährlich ). Die Frage bezog sich auf eine Abfrage, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, z. B. username: 'bill'
passend zu BILL
o Bill
und nicht eine Volltext-Suchanfrage, die auch auf gestaucht Worte von bill
, wie zum Beispiel Bills
, billed
usw.
Die Antworten, die vorschlagen, reguläre Ausdrücke zu verwenden, sind langsam, denn selbst mit Indizes ist die Dokumentation Staaten :
"Abfragen mit regulären Ausdrücken ohne Berücksichtigung der Groß-/Kleinschreibung können Indizes im Allgemeinen nicht effektiv nutzen. Die $regex-Implementierung ist nicht kollationssensitiv und kann keine case-insensitive Indizes verwenden."
$regex
Die Antworten bergen auch die Gefahr, dass Injektion von Benutzereingaben .
Wenn Sie die Regexp aus einer Variablen erstellen müssen, ist dies ein viel besserer Weg, dies zu tun: https://stackoverflow.com/a/10728069/309514
Sie können dann etwas tun wie:
var string = "SomeStringToFind";
var regex = new RegExp(["^", string, "$"].join(""), "i");
// Creates a regex of: /^SomeStringToFind$/i
db.stuff.find( { foo: regex } );
Dies hat den Vorteil, dass es programmatisch ist, oder Sie können einen Leistungsschub erhalten, indem Sie es vorzeitig kompilieren, wenn Sie es oft wiederverwenden.
Denken Sie daran, dass das vorherige Beispiel:
db.stuff.find( { foo: /bar/i } );
bewirkt, dass alle Einträge, die bar um die Abfrage abzugleichen ( bar1, barxyz, openbar ), könnte es sehr gefährlich für die Suche nach einem Benutzernamen in einer Auth-Funktion sein ...
Möglicherweise müssen Sie die Suche auf den Suchbegriff beschränken, indem Sie die entsprechende Regexp-Syntax verwenden:
db.stuff.find( { foo: /^bar$/i } );
Véase http://www.regular-expressions.info/ für Syntaxhilfe zu regulären Ausdrücken
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.