MongoDB: Ist es möglich eine Abfrage ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen?
Beispiel:
> db.stuff.save({"foo":"bar"});
> db.stuff.find({"foo":"bar"}).count();
1
> db.stuff.find({"foo":"BAR"}).count();
0
Kommentar zu dem Problem
Da MongoDB 3.2 Sie können den Befehl groß- / Kleinschreibung zu suchen, die mit
$caseSensitive: false
. Siehe: docs.mongodb.org/manual/reference/operator/query/text/... Beachten Sie, dass für text-Indizes nur.
InformationsquelleAutor der Frage Luke Dennis | 2009-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man eine regex.
In deinem Beispiel wäre das:
Ich muss sagen, obwohl, vielleicht könnten Sie einfach downcase (oder upcase) der Wert auf die Art und Weise, statt dass die extra Kosten jedes mal, wenn Sie es finden. Offensichtlich ist dies nicht funktioniert für die Namen von Personen und so, aber vielleicht use-cases wie tags.
InformationsquelleAutor der Antwort rfunduk
UPDATE:
Die original-Antwort ist nun obsolet. Mongodb unterstützt jetzt erweiterte Volltext-Suche mit vielen Funktionen.
ORIGINAL ANTWORT:
Es sollte angemerkt werden, dass die Suche mit regex die groß-und Kleinschreibung /i bedeutet, dass mongodb kann die Suche durch den index, also die Abfragen gegen große datasets kann eine lange Zeit dauern.
Sogar mit kleinen Datenmengen, es ist nicht sehr effizient. Sie nehmen eine viel größere cpu-hit, als Sie Ihre Abfrage sichert zu, das könnte zu einem Problem werden, wenn Sie versuchen, zu erreichen Skala.
Als alternative können Sie einen Großbuchstaben kopieren und suchen gegen. Zum Beispiel habe ich eine Tabelle User hat einen Benutzernamen, die gemischte groß-und Kleinschreibung, aber die id ist eine in Großbuchstaben Kopie der Benutzername. Dies gewährleistet die groß-und Kleinschreibung Vervielfältigung ist unmöglich (sowohl "Foo" und "foo" wird nicht erlaubt sein), und ich kann die Suche durch id = username.toUpperCase (), um eine case-insensitive Suche nach Benutzernamen.
Wenn das Feld groß ist, wie der Körper der Nachricht befindet, duplizieren von Daten ist wahrscheinlich nicht eine gute option. Ich glaube, mit einer von außen indexer wie Apache Lucene ist die beste option in diesem Fall.
InformationsquelleAutor der Antwort Dan
Beachten dass das vorhergehende Beispiel:
verursachen wird, alle Einträge mit bar mit der Abfrage übereinstimmen ( bar1, barxyz, openbar ), könnte es sehr gefährlich für einen Benutzernamen-Suche über eine auth-Funktion ...
Können Sie brauchen, um es nur übereinstimmungen des Suchbegriffs mit den entsprechenden regexp-syntax:
Sehen http://www.regular-expressions.info/ für die syntax-Hilfe zu regulären Ausdrücken
InformationsquelleAutor der Antwort jflaflamme
Wenn Sie brauchen, um das regexp aus einer variable, das ist ein viel besserer Weg, es zu tun: https://stackoverflow.com/a/10728069/309514
Können Sie dann etwas wie:
Dies hat den Vorteil, dass mehr programmatische oder Sie können ein performance-boost durch kompilieren vor der Zeit, wenn Sie wiederverwendet, eine Menge.
InformationsquelleAutor der Antwort Fotios
Als von Mongodb 3.4 verwenden Sie eine case-insensitive Sortierung index. Dies ist der Schnellste Weg, um eine case-insensitive Suche über die Datensätze der immer größeren Größe. Ich persönlich per E-Mail einer der Gründer der bitte, dies funktioniert, und er hat es geschafft! (Es war ein Problem auf JIRA für etwa 5 Jahren, und viele die angeforderte Funktion). Hier ist, wie es funktioniert:
Einer groß- /Kleinschreibung index wird durch angeben einer Sortierung mit einer Stärke von entweder 1 oder 2. Sie können erstellen Sie eine case-insensitive-index so:
, Oder Sie können es für die ganze Sammlung, die standardmäßig beim erstellen der Datenbank etwa so:
Und verwenden Sie es wie diese:
Diese wird wieder "New York", "new york", etc.
Alternativ können Sie alle Indizes verwenden eine Sortierung standardmäßig, wenn Sie die Sammlung wie diese:
Vorteil dieser Methode ist die deutlich verbesserte Effizienz und Geschwindigkeit bei größeren Datenmengen.
Weitere Infos: https://jira.mongodb.org/browse/SERVER-90 , https://docs.mongodb.com/manual/reference/collation/
InformationsquelleAutor der Antwort user3413723
InformationsquelleAutor der Antwort rshivamca
TL;DR
Richtige Weg, dies zu tun in mongo
Nicht Verwenden RegExp
Gehen natürlichen Und verwenden mongodb die eingebaute Indizierung , Suche
Schritt 1 :
Schritt 2 :
Müssen, erstellen Sie den index auf, welcher TEXT Feld, das Sie durchsuchen möchten , ohne Indizierung, Abfrage extrem langsam
Schritt 3 :
InformationsquelleAutor der Antwort vijay
Mongo (aktuelle version 2.0.0) nicht erlaubt, die groß- /Kleinschreibung sucht gegen indizierten Feldern - siehe Ihre Dokumentation. Für nicht-indizierte Felder, die regexes aufgeführt, die in den anderen Antworten sollten in Ordnung sein.
InformationsquelleAutor der Antwort Aidan Feldman
Die beste Methode ist in Ihrer Sprache der Wahl, wenn Sie ein Modell erstellen wrapper für Ihre Objekte, haben Ihre save () - Methode Durchlaufen eine Reihe von Feldern, die Sie suchen sein werden, auf die auch indiziert; diese Felder sollten Kleinbuchstaben Kollegen, die sind dann für die Suche verwendet.
Jedes mal, wenn Sie das Objekt erneut gespeichert wird, die Kleinbuchstaben Eigenschaften werden dann geprüft und aktualisiert mit den änderungen zu den wichtigsten Eigenschaften. Das macht es so können Sie die Suche effizient, aber blenden Sie die zusätzliche Arbeit benötigt, um update der lc-Felder jedes mal.
Kleinschreibung Felder könnte ein Schlüssel:Wert-Objekt speichern oder einfach nur den Namen des Feldes mit einem Präfix lc_. Ich benutze die zweite zu vereinfachen Abfragen (deep-Objekt Abfragen kann manchmal verwirrend sein).
Hinweis: Sie indizieren möchten die lc_ Felder, nicht die wichtigsten Felder, auf denen Sie beruhen, aus.
InformationsquelleAutor der Antwort RobKohr
Angenommen, Sie möchten die Suche "Spalte" in "Tabelle" und Sie wollen Fall insenstive suchen. Die beste und effizienteste Weise ist, wie unten;
Obige code fügt nur Ihrer Suche Wert als RegEx und suchen im mit insensitve Kriterien mit "i" als option.
Alle das beste.
InformationsquelleAutor der Antwort Ankur Soni
Eine sehr wichtige Sache im Auge zu behalten, wenn über eine Regex-basierten Abfrage -, Wenn Sie tun dies für ein login-system, Flucht jedes einzelne Zeichen Sie sind auf der Suche nach, und vergessen Sie nicht, die ^ und $ Betreiber. Lodash hat eine nette Funktion für diese, sollten Sie es bereits:
Warum? Stellen Sie sich eine Benutzer-Eingabe
.*
wie sein username. Das wäre mit allen Benutzernamen, sodass eine Anmeldung nur durch erraten des Passworts eines jeden Benutzers.InformationsquelleAutor der Antwort Ziao
Mit Mungo dieser arbeitete für mich:
InformationsquelleAutor der Antwort ChrisRich
Dem aggregation-framework wurde eingeführt, mongodb 2.2 . Sie können die string-operator "$strcasecmp", um eine groß- /Kleinschreibung-Vergleich zwischen den Zeichenfolgen. Es ist mehr empfohlen und einfacher als die Verwendung von regex.
Hier ist das offizielle Dokument, das auf der aggregation Befehl operator: https://docs.mongodb.com/manual/reference/operator/aggregation/strcasecmp/#exp._S_strcasecmp .
InformationsquelleAutor der Antwort Jogue Wasin
Können Sie groß-und Kleinschreibung Indizes:
Folgende Beispiel erstellt eine Sammlung mit keine Standard-Sortierung, fügt dann einen index auf das Feld name mit einem groß-und Kleinschreibung Sortierung. Internationale Komponenten für Unicode
Verwenden Sie den index, müssen die Abfragen geben Sie die gleiche Sortierung.
oder können Sie eine Sammlung erstellen mit der Standard-Sortierung:
InformationsquelleAutor der Antwort Gencebay D.
Habe ich einen einfachen Func für die groß /Kleinschreibung bei regex, welches ich in meinen filter.
Dann filtern Sie einfach auf ein Feld wie folgt.
InformationsquelleAutor der Antwort Nitesh
Wie Sie sehen können, in mongo docs - seit der version 3.2
$text
index case-insensitive ist standardmäßig: https://docs.mongodb.com/manual/core/index-text/#text-index-case-insensitivityErstellen Sie ein text-index und verwenden Sie $text-operator in Ihrer Abfrage.
InformationsquelleAutor der Antwort avalanche1
Diese wurden getestet und für die string-Suche
InformationsquelleAutor der Antwort Ar maj
Mithilfe der filter funktioniert für mich in C#.
Kann es sogar verwenden Sie den index, weil ich glaube, dass die Methoden aufgerufen werden, die nach der Rückkehr passiert, aber das habe ich noch nicht getestet, heraus noch.
Dies vermeidet auch das problem der
dass mongodb denken p.Titel.ToLower() ist eine Eigenschaft und wird nicht ordnungsgemäß zugeordnet.
InformationsquelleAutor der Antwort A_Arnold
Hatte ich standen vor einem ähnlichen Problem und das ist was für mich gearbeitet:
InformationsquelleAutor der Antwort Woppi
Für die Suche nach einer Variablen und Flucht:
Flucht die variable schützt die Abfrage gegen Angriffe mit '.*' oder andere regex.
escape-string-regexp
InformationsquelleAutor der Antwort davidivad