Frage

Als ich versuchte, eine Sammlung ein String -Feld zu sortieren (hier hier Title), sortieren nicht wie erwartet. Siehe unten:

db.SomeCollection.find().limit(50).sort({ "Title" : -1 });

Tatsächliche Ergebnisreihenfolge

  • "Titel": "Geog.3 Studentenbuch"
  • "Titel": "Geog.2 Studentenbuch"
  • "Titel": "Geog.1 Studentenbuch"
  • "Titel": "Zoe und Swift"
  • "Titel": "Reißverschluss im Themenpark"
  • "Titel": "Reißverschluss im Supermarkt"

Erwartete Ergebnisreihenfolge

  • "Titel": "Zoe und Swift"
  • "Titel": "Reißverschluss im Themenpark"
  • "Titel": "Reißverschluss im Supermarkt"
  • "Titel": "Geog.3 Studentenbuch"
  • "Titel": "Geog.2 Studentenbuch"
  • "Titel": "Geog.1 Studentenbuch"

Gleiche Probleme treten auf, wenn ich versuchte, nach Datum zu sortieren.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Aktualisieren: Version 3.4 hat Fallunempfindliche Indizes

Dies ist ein bekanntes Problem. MongoDB unterstützt keine lexikalische Sortierung für Zeichenfolgen (JIRA: String Lexikografische Ordnung). Sie sollten die Ergebnisse in Ihrem Anwendungscode sortieren oder mit einem numerischen Feld sortieren. Es sollte jedoch zuverlässig die Datumsfelder sortieren. Können Sie ein Beispiel geben, in dem Sortieren nach Datum nicht funktioniert?

Andere Tipps

Was genau überrascht dich?

Es sortiert basierend auf der Präsentation der numerischen Darstellung des Symbols. Wenn Sie suchen hier (Ich weiß, dass MongoDB String in UTF-8 speichert, also ist dies nur für Bildungszwecke). Sie sehen, dass die oberen Fallbuchstaben entsprechende Nummern unter niedrigeren und unteren Fallbuchstaben haben. So werden sie vorne gehen.

MongoDB kann keine Buchstaben basierend auf Lokalisierung oder Fall unempfindlich sortieren.

In Ihrem Fall g hat dann eine höhere Anzahl Z, Also geht es zuerst (sortieren in abnehmender Reihenfolge). Und dann 3 hat dann die entsprechende Zahl höher 2 und 1. Im Grunde ist alles richtig.

Wenn Sie die erwartete Output -Ausgabe verwenden, siehe unten:

    db.collection.aggregate([
    { 
        "$project": {
           "Title": 1,        
           "output": { "$toLower": "$Title" }       
        }},
        { "$sort": {  "output":-1 } },
        {"$project": {"Title": 1, "_id":0}}
    ])


es wird dir geben erwartete Ausgabe wie nachstehend:

    {
        "result" : [ 
            {
                "Title" : "Zoe and Swift"
            }, 
            {
                "Title" : "Zip at the Theme Park"
            }, 
            {
                "Title" : "Zip at the Supermarket"
            }, 
            {
                "Title" : "geog.3 students' book"
            }, 
            {
                "Title" : "geog.2 students' book"
            }, 
            {
                "Title" : "geog.1 students' book"
            }
        ],
        "ok" : 1
    }

Beginnend mit den Daten, die nicht richtig sortieren ....

Wenn Sie ein Datum als Datum speichern string, Es muss als Zeichenfolge sortierbar sein. Es ist ganz einfach:

2013-11-08  // yyyy-mm-dd (the dashes would be optional)

Solange jedes Stück der Datumsschnur mit gepolstert ist 0 Richtig, die Saiten werden natürlich auf natürliche Weise und in der Art und Weise erwartet.

In UTC wird in der Regel eine vollständige Datumszeit gespeichert: In der Regel:

2013-11-23T10:46:01.914Z

Aber ich würde Ihnen auch vorschlagen, dass Sie anstatt einen Datumswert als Zeichenfolge zu speichern, überlegen Sie, ob die Verwendung eines nativen MongoDB -Datums mehr Sinn machen würde (Hinweis). Wenn Sie sich das Aggregationsrahmen von MongoDB ansehen, werden Sie feststellen, dass es viele gibt Funktionen Das kann diese Daten manipulieren, während eine Saite sehr begrenzt ist.

In Bezug auf die Sortierung der Zeichenfolge wurde darauf hingewiesen, dass es eher die Daten sortiert, und nicht die Art und Weise, wie Sie als Person sortieren würden. Wenn Sie die Zeichenfolge als ASCII/UTF-8-Darstellung aufbewahren, sollten Sie sehen, warum die Sortierung so funktioniert, wie sie ist:

Zoe = [90, 111, 101]
geo = [103, 101, 111]

Wenn Sie diese in absteigender Reihenfolge sortieren, wie Sie angegeben haben, sollten Sie sehen, wie "geo"Die interne Byte -Darstellung ist größer als die der Zeichenfolge "Zoe" (mit 103 Sortieren höher als 90 in diesem Fall).

In der Regel wird die Empfehlung bei der Verwendung von MongoDB darin bestehen, die Saiten zweimal zu speichern, wenn Sie eine Zeichenfolge sortieren müssen, die gemischtes Gehäuse hat:

  1. Originalzeichenfolge ("Title")
  2. Als normalisierte Zeichenfolge. Möglicherweise zum Beispiel alle als "Kleinbuchstaben" "möglicherweise mit akzentuierten Zeichen, die auch in einen gemeinsamen Charakter konvertiert sind. Sie würden also ein neues Feld namens namens erhalten "SortedTitle" Zum Beispiel und Ihr Code würde das verwenden, um zu sortieren, aber das tatsächliche anzeigen "anzeigen"Title" für Benutzer.

Wenn Sie in ROR und Mongomapper tun, befolgen Sie die folgenden Schritte:

Ich habe meinen Modellnamen ABC und Fetch -Ergebnis für den Titel genommen.

@test_abc_details_array_full=Abc.collection.aggregate([

     {"$project"=> {
       "Title"=> 1,        
       "output"=> { "$toLower"=> "$Title" }       
    }},
    { "$sort"=> {  "output"=>1 } },        
    {"$project"=> {Title: 1, _id:0}},

  ]); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top