Sortieren nach Sortierung in MongoDB

7

Eine Sammlung haben:

%Vor%

ex. Wie sortiere ich es in Spanisch case insensitive?

Ich habe es versucht:

%Vor%

Ausgabe ist:

%Vor%

gewünschtes Ergebnis:

%Vor%     
Joan Vega 19.09.2012, 15:42
quelle

5 Antworten

10

Ich weiß, das ist ein alter Thread, aber ich denke, es wäre nützlich, trotzdem zu antworten.

Sie möchten auf keinen Fall die Sortierung in Ihrer App durchführen, da Sie alle Dokumente in der Sammlung in den Speicher laden müssen, um sie zu sortieren und das gewünschte Fenster zurückzugeben. Wenn Ihre Sammlung riesig ist, ist dies äußerst ineffizient. Die Datenbank sollte die Sortierung durchführen und das Fenster an Sie zurücksenden.

MongoDB unterstützt jedoch keine länderspezifische Sortierung, sagen Sie. Wie löst man das Problem? Die Magie ist das Konzept der "Sortierschlüssel".

Nehmen wir an, Sie hätten das normale englische / lateinische Alphabet von "a" bis "z". Sie erstellen eine Sortierschlüsselzuordnung von "a" zu "01" und von "b" zu "02" usw. bis "z" bis "26". Das heißt, ordnen Sie jedem Buchstaben eine Nummer in der Sortierreihenfolge für diese Sprache zu und codieren Sie diese Nummer dann als Zeichenfolge. Ordnen Sie dann die Zeichenfolge, die Sie sortieren möchten, dieser Art von Sortierschlüssel zu. Zum Beispiel würde "abc" zu "010203" werden. Fügen Sie dann Ihrem Dokument eine Eigenschaft mit dem Sortierschlüssel für eine Eigenschaft hinzu und fügen Sie den Namen der Eigenschaft mit dem Namen des Gebietsschemas an:

%Vor%

Jetzt können Sie in der Sprache "en" sortieren, indem Sie einfach in der Eigenschaft "name_en" indexieren und anstelle von "name" -Eigenschaft eine einfache alte englischsprachige MongoDB-Sortierung für Selektoren und Bereiche verwenden.

Nun, nehmen wir an, Sie haben eine andere verrückte Sprache "xx", wo die Reihenfolge des Alphabets "acb" statt "abc" ist. (Ja, es gibt Sprachen, die auf diese Weise mit der Reihenfolge des lateinischen Alphabets umgehen!) Der Sortierschlüssel wäre wie folgt:

%Vor%

Nun müssen Sie nur noch Indizes für name_en und name_xx erstellen und die reguläre MongoDB-Sortierung verwenden, um diese Gebietsschemas korrekt zu sortieren. Grundsätzlich sind die zusätzlichen Eigenschaften Proxies zum Sortieren in verschiedenen Gebietsschemas.

Woher bekommen Sie diese Mappings, fragen Sie? Schließlich bist du kein Globalisierungsexperte, oder?

Nun, wenn Sie Java, C oder C ++ verwenden, gibt es fertige Klassen, die diese Zuordnung für Sie übernehmen. Verwenden Sie in Java die Standard-Collator-Klasse oder verwenden Sie die icu4j-Collator-Klasse. Wenn Sie C / C ++ verwenden, verwenden Sie die C / C ++ - Version der ICU Collator-Funktionen / -Klasse. Für andere Sprachen sind Sie eine Art Pech, es sei denn, Sie können eine Bibliothek finden, die das bereits tut.

Hier sind einige Links, die Ihnen helfen sollen, sie zu finden:

Die Standard-Java-Bibliothek Collator: Ссылка

Die C ++ Collator-Klasse: Ссылка

Sie können auch verschiedene Sortierschlüssel erstellen, mit denen Sie die Groß- und Kleinschreibung je Gebietsschema (ja, das Fallmapping ist Gebietsschema-empfindlich!) und Akzent-unempfindlich und Unicode-Varianten-unempfindlich oder eine Kombination aus dem Obigen sortieren können. Das einzige Problem ist, dass Sie jetzt viele Eigenschaften haben, die jede sortierbare Eigenschaft parallelisieren, und Sie müssen sie alle synchron halten, wenn Sie die Eigenschaft "name" der Basis aktualisieren. Es ist ein Schmerz in der Sie-wissen-was, aber immer noch, es ist besser als das Sortieren in Ihrer App oder Business-Logik-Ebene.

Achten Sie auch auf Cursor mit Bereichen. Im Englischen ignorieren wir zum Beispiel einfach die Akzente bei den Charakteren. Ein "Ö" sortiert also genauso wie "O" und es erscheint im Bereich "M" bis "Z". Aber auf Schwedisch sortieren Buchstaben mit Akzenten nach "Z". Also, wenn Sie einen Bereich "M" - "Z" machen, werden Sie eine Reihe von Datensätzen einschließen, die mit "Ö" beginnen, die auf Englisch, aber nicht auf Schwedisch vorhanden sein sollten.

Dies hat auch Auswirkungen auf das Sharding, wenn Sie eine Texteigenschaft eines Dokuments teilen. Sei vorsichtig, welche Bereiche in welchen Shard gehören. Es wäre besser, Dinge zu zerlegen, die nicht lokalitätssensitiv sind, wie Hashes.

    
Edwin Hoogerbeets 04.06.2014, 05:55
quelle
9

Obwohl die anderen Antworten hier für die MongoDB-Versionen 3.2.x und vorherige korrekt sind, können Sie ab 3.4.0 "Kollationen für eine Sammlung oder eine Ansicht, einen Index oder bestimmte Operationen, die Kollation unterstützen" angeben.

>

Die vollständige Dokumentation für das Feature finden Sie hier .

    
IanWhalen 03.11.2016 16:15
quelle
3

Momentan implementiert MongoDB keine Sortierung.

Die Implementierung des Unicode-Vergleichsstandards ist der beste Weg, um dies zu lösen.

Aber das würde die Sortierung verlangsamen und die Indizes größer machen. Also, für jetzt ist es am besten, in Ihrer Anwendung zu sortieren.

    
saeed 19.09.2012 15:52
quelle
2

Eine einfache Lösung besteht darin, ein neues Feld zu erstellen, in dem Text in einfache ASCII-Zeichen konvertiert wird.

%Vor%

Dann einfach nach 'name_sort' sortieren

    
Pedro L. 01.08.2013 20:12
quelle
1

Leider können Sie noch keine Sortierung nach Groß- / Kleinschreibung vornehmen, jetzt gibt sort in der Reihenfolge "index" zurück. Es gibt ein offenes Ticket:

Ссылка

Sie können überlegen, die Sortierung in Mongo zu überspringen und dies in Ihrer App zu tun.

    
Scott Presnell 19.09.2012 15:47
quelle

Tags und Links