2016-06-21 15 views
1

ich eine Reihe von Daten wie dieses:sortieren Dokumente basierend auf erste Zeichen in Feldwert

[{name: "ROBERT"}, {name: "PETER"}, {name: "ROBINSON"} , {name: "ABIGAIL"}] 

Ich möchte eine einzige mongodb Abfrage machen, finden Sie unter:

  1. Alle Daten, die Namen beginnt mit dem Buchstaben "R" (regex:^R)
  2. von jedem Daten folgen die Namen Buchstabe "R" nicht als das erste Zeichen, wie enthält: Peter, adleR oder CARL

so erzeugt er:

[{name: "ROBERT"}, {name: "ROBINSON"}, {name: "PETER"}] 

es im Grunde nur alle Daten anzuzeigen, die „R“ Zeichen in es enthält, aber ich mag es sortieren, so dass Daten mit „R“ als erstes Zeichen erscheinen, bevor der Rest

Bis jetzt bin ich mit 2 separaten Abfrage, gefolgt von einer Operation, um doppelte Ergebnisse zu beseitigen, dann trat sie. Gibt es einen effizienteren Weg, dies in Mongo zu tun?

+0

Criteria (2) ist unklar. Es scheint, als ob Sie das Dokument wollen, in dem 'name'' R' enthält. Wenn das der Fall ist dann [Wie frage ich mongodb mit "Gefällt mir"?] (Https://stackoverflow.com/questions/3305561/how-do-i-query-mongodb-with-like) – styvane

+0

Nein, ich gerade meine Frage bearbeitet, um mehr Klarheit zu geben. Ich möchte: alle Daten anzeigen, wo 'Name'' R' enthält, aber ich möchte es so Daten mit "R" sortieren, wie das erste Zeichen vor dem Rest erscheint – DennyHiu

Antwort

2

Was Sie wollen, ist ein weight Sie Dokumente hinzufügen und sie entsprechend sortieren.

Zuerst müssen Sie nur die Dokumente auswählen, die $match Ihre Kriterien mit regulären Ausdrücken verwenden.

Um dies zu tun, müssen Sie $project Ihre Dokumente und fügen Sie die "Gewicht" basierend auf dem Wert des ersten Zeichens der Zeichenfolge mit einer logischen $cond ition Verarbeitung.

Die Bedingung hier ist $eq das Gewicht1 auf das Dokument, wenn das Klein des ersten Zeichens im Namen hinzuzufügen ist „r“ oder 0, wenn es nicht ist.

Natürlich die $substr und die $toLower String Aggregation Operatoren geben jeweils das erste Zeichen in Kleinbuchstaben zurück.

Endlich Sie $sort Ihre Dokumente nach Gewicht in absteigender Reihenfolge.

db.coll.aggregate(
    [ 
     { "$match": { "name": /R/i } }, 
     { "$project": { 
      "_id": 0, 
      "name": 1, 
      "w": { 
       "$cond": [ 
        { "$eq": [ 
         { "$substr": [ { "$toLower": "$name" }, 0, 1 ] }, 
         "r" 
        ]}, 
        1, 
        0 
       ] 
      } 
     }}, 
     { "$sort": { "w": -1 } } 
    ] 
) 

die produziert:

{ "name" : "ROBERT", "w" : 1 } 
{ "name" : "ROBINSON", "w" : 1 } 
{ "name" : "PETER", "w" : 0 } 
+0

es ist unerwartet erscheint. Vielen Dank. Was soll ich tun, wenn ich meine Sortierbasis von einem einzelnen Zeichen auf einen regulären Ausdruck umstellen möchte?Mein Projekt verlangt die Sortierung von Dokumenten basierend auf dem ersten "Wort/Abfrage" dieser Benutzereingabe – DennyHiu

0

versuchen Sie dies:

db.collectioname.find ("name":/R/) 
+0

was es versucht zu erreichen? Ja sicher, es wird alle Daten anzeigen, die "R" enthält, aber ich möchte es so sortieren, dass "Daten mit R als das erste Zeichen vor den Daten mit R als das mittlere Zeichen" – DennyHiu

Verwandte Themen