2017-08-16 1 views
0

Ich versuche, diese SQL-Abfrage in MongoDB zu replizieren:MongoDB - Finden Sie Benutzer nach Namen oder Nachnamen oder Vornamen + Namen

SELECT * FROM users WHERE 
name LIKE CONCAT('%', :search_txt, '%') OR 
surname LIKE CONCAT('%', :search_txt, '%') OR 
CONCAT(name, ' ', surname) LIKE CONCAT('%', :search_txt, '%') 

Bisher habe ich nach dem Namen oder Namen mit diesem Code suchen verwaltet, aber ich kann ‚t herauszufinden, wie auch die Suche nach Namen + Nachnamen

User.find(
{ 
    "$or": [ 
      {"name" : new RegExp(req.body.term, 'i')}, 
      {"surname" : new RegExp(req.body.term, 'i')} 
     ] 
    } 

Dank

+0

Funktioniert die SQL-Abfrage, wenn Namen als Nachname + Name eingegeben werden? Funktioniert es, wenn zwischen zwei Namen zwei Leerzeichen stehen? –

+0

@Alex Blex Ich habe es nur so geschrieben, um es so einfach wie möglich zu machen, in dem ursprünglichen Projekt, in dem ich es benutzte, hatte ich auch einen anderen OR, um den Fall Nachname + Name abzudecken. – Nite

+0

Die bessere Option hier ist, die Zeichenfolge zu "teilen" und die Argumente an $ oder als separate Wörter zu senden. Regex-Übereinstimmungen oder Verkettungen erfordern einen "vollständigen Sammlungs-Scan", aber das Bereitstellen von "exakten Übereinstimmungs" -Begriffen ist nicht und ist daher um Größenordnungen schneller. Außerdem sollten Sie die Groß-/Kleinschreibung normalisieren oder Groß- und Kleinschreibung beachten, wenn Ihre MongoDB dies unterstützt. Vermeiden Sie Groß- und Kleinschreibung bei regulären Ausdrücken oder berechneten Ausdrücken, wenn Sie die Antwortzeit der Abfrage auf ein Minimum beschränken möchten. –

Antwort

0

Hier gehen Sie:

User.aggregate({ 
    $addFields: { 
     "fullname": { 
      $concat: [ "$name", ' ', "$surname" ] 
     } 
    } 
}, { 
    $match: { 
     "$or": [ 
      {"name": new RegExp(req.body.term, 'i')}, 
      {"surname": new RegExp(req.body.term, 'i')}, 
      {"fullname": new RegExp(req.body.term, 'i')} 
     ]   
    } 
+0

Vielen Dank, funktioniert. Ich musste [] hinzufügen, um die" Argumente müssen aggregierte Pipelinebetreiber sein ". – Nite

+0

Ja, abhängig von Ihr Kunde, der benötigt wird. Mein Code funktioniert innerhalb der Robomongo-Konsole. – dnickless

Verwandte Themen