2016-08-01 8 views
2
db.restaurant_info.find({name:/pi/i}) 

Oberhalb mongodb Abfrage der Daten von DB im folgenden Format zurückkehrArt MongoDB() -Ausgabe finden nach regex

{ 
    "_id" : ObjectId("579cf26204aba69a41da82ad"), 
    "name" : "pizza hut", 
    "type" : "restaurant" 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("579cf26204aba69a41da82af"), 
    "name" : "Kai pi", 
    "type" : "restaurant" 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("579cf26404aba69a41da82c7"), 
    "name" : "pizza and pasta", 
    "type" : "restaurant" 
} 

/* 4 */ 
{ 
    "_id" : ObjectId("579cf26504aba69a41da82d0"), 
    "name" : "Crispi chicken", 
    "type" : "restaurant" 
} 

/* 5 */ 
{ 
    "_id" : ObjectId("579cf26504aba69a41da82d1"), 
    "name" : "Pita house", 
    "type" : "restaurant" 
} 

jedoch diese Abfrage wird für Auto-Population verwendet werden, so dass, wenn ich pi im Suchtextfeld, dann werden alle recodrs mit pi beginnen, bevor andere Aufzeichnungen kommen sollte, ich zB Folge erwarten bin:

Pizza hut 
Pizza and pasta 
Pita house 
Kai pi 
Crispi chicken 

wenn ich die Abfrage mit db.restaurant_info.find({name:/^pi/i}) ändern, dann kehrt er

Pizza hut 
Pizza and pasta 
Pita house 

ohne

Kai pi 
Crispi Chicken 

Bitte führen Sie mir, welche Abfrage sollte ich die Reihenfolge zu erhalten verwenden, um Ich erwarte.

Antwort

0

Ich weiß nicht, wie Sie dies mit Fund tun würden(), aber Sie es mit Aggregate tun könnten().

Zuerst Sie Ihre Regex für die $ passen verwenden würde, dann könnte man $ Projekt mit $ String verwenden und $ eq ein Feld zu projizieren anzeigt, ob Sie ein Präfix Spiel haben. Sie könnten dann dieses Feld verwenden, um Ihre Ergebnisse zu sortieren. Hier ist ein Beispiel. Ich benutzte auch $ toLower, so dass Ihre Sortierung Groß-und Kleinschreibung würde.

{ 
    $match: { 
     name:/pi/i 
    } 
}, 
{ 
    $project: { 
     name:true, 
     regex_match: { 
      $eq: [ 
       "pi", 
       { $substr: [ {$toLower: "$name"}, 0, 2 ] } 
      ] 
     } 

    } 
}, 
{ 
    $sort: {regex_match:-1} 
}