2016-03-22 3 views
3

Der Titel der Frage fasst meinen aktuellen Ansatz macht bei dem Versuch, Abfrage zu tun, dass die folgenden zu erreichen versucht:

„alle Dokumente dass die Textsuchkriterien entsprechen oder nicht und eine Reihe anderer Eigenschaften erfüllen“

Meine Anfrage unter:

var query = { 
      $or: [ 
       { $text: { $search: searchText } }, 
      ], 
      $and: [ 
       {createdon: { $gte: start_date, $lt: end_date} }, 
       {author: req.user._id} 
      ] 

     }; 

Wenn eine leere Zeichenfolge durch den Benutzer gesendet wird die Abfrage liefert keine Ergebnisse, obwohl es in der Sammlung Dokumente gibt, die z t die Kriterien, die der Benutzer in der AND-Klausel in der Anfrage gesendet hat.

Also im Grunde kratze ich meinen Kopf, wie man die $ Textsuche von MongoDB mit einer leeren Zeichenfolge arbeiten kann.

Ich weiß, dass ich einfach vor dem Erstellen der Abfrage Text könnte, so etwas wie so:

var query; 
    if (!searchText.length) { 
    //We know there's no search text, so just use the conditions in the AND clause 
    query = { 
     createdon: { $gte: start_date, $lt: end_date}, 
     author: req.user._id 
    }; 

Nur frage mich, ob ich diese gewünschte Funktionalität ohne bekommen kann die Abfrage Objekt innerhalb des Steuerflusses eines bedingten zu erstellen.

+0

MongoDB indiziert keine Leerzeichen als Teil des Volltexts – Saleem

+0

@Saleem Ich weiß, dass ich nach dem Betrachten der Dokumente mich frage, ob ich etwas falsch mit der Syntax des $ oder der Bedingung oder etwas entlang denen mache Linien .. Würden Sie sagen, die bedingte Deklaration der Abfrage ist der Weg zu gehen? –

+0

Ihr zweiter Ansatz ist der beste Weg zu gehen. Es spart MongoDB für nichts hart arbeiten :) – Saleem

Antwort

1

Für zukünftige Leser:

Ich kann nicht scheinen, um dieses Problem zu arbeiten, denn jetzt so das ich mit der bedingten Erklärung der Abfrage gegangen bin zur Arbeit zu kommen und das funktioniert ganz gut.

//Get the search text from the request  
    var searchText = req.body.searchText || ""; 

    var query = { 
     event_date: { $gte: start_date, $lt: end_date}, 
     author: req.user.id 
    }; 

    //Check if there is any search text before applying the $text query 
    if (searchText.length) { 

    query["$text"] = { $search: searchText } 
    } 

Dies ignoriert jetzt nur die Textsuche, wenn nichts gesendet wurde.

Dies ist die Antwort, bis jemand antwortet!

Verwandte Themen